Hibernate Criteria Projection
-
02-10-2019 - |
Frage
Nun, wie die Frage Titel sagt, ich versuche, eine Projektionskriterien zu machen Abfragen nur einige der Tabellenattribute.
Also habe ich eine Person Tabelle / Klasse und es hat über 40 Attribute. Ich meine Kriterien wollen dynamischen Anzahl von Attributen zu bekommen, 10 können sagen, 11 oder 12 (SQL Begriffe select firstname, lastname from person
) und ich tat es wie folgt aus:
Transaction tx = session.beginTransaction();
Criteria crit = session.createCriteria(Person.class);
crit.setCacheable(true);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id"));
Criterias c = null;
for (int i = 0; i < checked.size(); i++) {
Attribute attr = checked.elementAt(i);
switch (attr) {
case LASTNAME:
projList.add(Projections.property("lastName"));
c = enumMap.get(attr);
if (c.isChanged()) {
String tmp = (String) c.getAnswer();
tmp = tmp.replace('*', '%');
crit.add(Restrictions.like("lastName", tmp));
crit.addOrder(Order.asc("lastName"));
}
case ...THE REST .....
}
crit.setProjection(projList);
retList = crit.list();
tx.commit();
return retList;
und es gibt wieder, dass die retList
Elemente nicht aus dem Person.class
:
INFO [AWT-Eventqueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
Fatal [AWT-Eventqueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; kann nicht auf usergroupmanager.model.db.Person gegossen werden java.lang.ClassCastException: [Ljava.lang.Object; kann nicht auf usergroupmanager.model.db.Person gegossen werden
Bitte Hilfe, denn jetzt bin ich die Auflistung all 40+ attr, und es dauert Zeit abfragen und ich weiß nicht wie es. Ich suche auch eine alternative Lösung, die mir dieses Problem lösen helfen. Ich las über ResultTransformer
aber havent gefunden, wie es in meinem Fall zu verwenden.
Lösung
[Ljava.lang.Object; kann nicht gegossen werden usergroupmanager.model.db.Person
Says in sauberen Worten Object[]
kann nicht auf Person
gegossen werden. Wenn Sie eine Projektion zu tun, erhalten Sie die Attribute, die Sie als ein Array von Objekten statt einer hydrierten Einheit ausgewählt.
Ihr Code fehlt die Deklaration von retlist
. Ich denke, es ist eine rohe List
, die Sie zu einem List<Person>
irgendwo werfen. ersetzen, die nur mit List<Object[]>
.
Andere Tipps
Sie können criteria.setResultTransformer verwenden ()
Es gibt einige Transformers in Hibernate zur Verfügung gestellt. Wenn Ihre Person hat dies keine Assoziation verwenden:
criteria.setResultTransformer(Transformers.aliasToBean(Person.class));
Aber wenn eine Person irgendein Verein hat, Gebrauch Seimos unter http://github.com/moesio/seimos
Eine Menge Code gespeichert werden könnten, wenn Sie es verwenden, anstatt Kriterien.
Wenn Sie eine Projektion in den Ruhezustand verwenden Sie nicht alle Daten abfragen muss Hibernate um die Objekte erstellen. So Hibernate können die Objekte nicht erstellen.
So ist die Abfrage von einer Projektion gibt nur eine Reihe von SQL von der Abfrage zurückgegeben dh es eine s-Liste zurückgibt und Sie Zugriff auf die Felder als Klar Einträge in diesem Array.