Zum Inhalt springen

Hibernate: Wie DetachedCriteria und Projections kombinieren?


Ezra

Empfohlene Beiträge

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 von Ezra
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Ezra
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Ezra
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...