Ezra Geschrieben 11. April 2011 Geschrieben 11. April 2011 (bearbeitet) Hallo, ich arbeite an einem Projekt, das u.a. Hibernate und Seam verwendet. Ich möchte Projections für eine Suchfunktion nutzen, habe damit auch keine Probleme solange ich ausschließlich mit Criteria arbeite. Zum Beispiel funktioniert das hier super (das ist nicht der endgültige Code, sondern nur zum Testen): Criteria crit = hibernateSession.createCriteria(Measure.class); ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("name")); projList.add(Projections.property("start")); crit.setProjection(projList); List<?> results = crit.list(); log.info("do projections"); if (results.size() == 0) { log.info("sorry, no results"); } for (Object obj : results) { if (obj instanceof Object[]) { for (Object o : (Object[]) obj) { log.info(o); } } else { log.info(obj); } } Output: 11:08:55,571 INFO [searchActions] SAP 11:08:55,571 INFO [searchActions] 2011-04-03 11:08:55,571 INFO [searchActions] Bienenzucht 11:08:55,571 INFO [searchActions] 2011-04-04 11:08:55,571 INFO [searchActions] Kakaobohnen 11:08:55,571 INFO [searchActions] 2011-04-04 11:08:55,571 INFO [searchActions] Tigerzucht 11:08:55,571 INFO [searchActions] 2011-04-11 In Verbindung mit detachedCriteria bekomme ich jedoch nicht die gewünschten Ergebnisse: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Measure.class); ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("name")); projList.add(Projections.property("start")); detachedCriteria.setProjection(projList); Criteria criteria = this.detachedCriteria.getExecutableCriteria(this.hibernateSession); List<?> results = criteria.list(); log.info("do projections"); if (results.size() == 0) { log.info("sorry, no results"); } for (Object obj : results) { if (obj instanceof Object[]) { for (Object o : (Object[]) obj) { log.info(o); } } else { log.info(obj); } } Output: 10:47:59,434 INFO [searchActions] entity.Training@16153c1 10:47:59,434 INFO [searchActions] entity.Training@6dfc1d 10:47:59,434 INFO [searchActions] entity.Certification@ca2408 10:47:59,434 INFO [searchActions] entity.Training@1751415 Offensichtlich wird hier keine Liste mit Object-Arrays zurückgegeben, sondern die gesamten Entities, was ich doch gerade mit den Projections vermeiden will. Woran liegt das und wie kann ich das ändern? Ich konnte über Google und auch in meinen Büchern noch keine zufriedenstellende Antwort finden. Beste Grüße Ezra PS: Ich habe bei meiner Suche auch so etwas gesehen, um die Criteria zu bekommen: List list = getHibernateTemplate().findByCriteria( detachedCriteria ); Aber offenbar gibt es diese Methode nur bei Spring (oder irre ich mich?) und das würde mir nichts nützen. Bearbeitet 11. April 2011 von Ezra Zitieren
mtn Geschrieben 11. April 2011 Geschrieben 11. April 2011 Hi, ich benutze in so einem Fall "Result Transformer", Erklärung und Beispiele gibts hier: Hibernate 3.2: Transformers for HQL and SQL - SWiK Vielleicht hilfts weiter? Gruß Zitieren
Ezra Geschrieben 11. April 2011 Autor Geschrieben 11. April 2011 (bearbeitet) Danke für den Vorschlag. Ich habe mir die Seite angeguckt, verstehe jedoch nicht, wie die Transformer mein Problem mit der DetachedCriteria lösen können. Meinst Du, ich solle die Transformer anstelle der Projections verwenden? Falls ja, habe ich folgende Bedenken: Es klingt für mich so, als würden die Transformer die Ergebnisse erst umwandeln, nachdem sie schon aus der Datenbank geholt wurden (falls dem nicht so ist, habe ich etwas falsch verstanden). In diesem Fall sind sie nicht von Nutzen für mich, weil ich die Projections verwende, um den Netzverkehr zwischen Datenbank- und Anwendungsserver zu reduzieren. Die Projections werde ich also weiterhin nutzen. Edit: Die gezeigte Anwendung der Transformer, um eine Nicht-Entitiy-Klasse zu bekommen, werde ich allerdings nutzen. Das scheint mir sehr praktisch. Danke. Bearbeitet 11. April 2011 von Ezra Zitieren
Ezra Geschrieben 11. April 2011 Autor Geschrieben 11. April 2011 (bearbeitet) Ohje. Ich habs herausgefunden. Ganz bescheuerter Fehler: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Measure.class); Criteria criteria = this.detachedCriteria.getExecutableCriteria(this.hibernateSession); Dieses "this" muss weg. Das kommt von copy&paste. Verdammt. Kann geschlossen werden. Bearbeitet 11. April 2011 von Ezra Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.