2009-09-24 8 views
7

Ich habe diese Klasse als eine Entität zugeordnet, lassen Sie uns Person nennen. Person hat eine eingebettete/Komponentenbeziehung zu Adresse. Ich habe Probleme, ein Kriterium zu verwenden, das Adressobjekte zurückgeben würde. Ich habe dies versucht:Abrufen embedded oder Komponente mit Hibernate Kriterien api

Criteria.createCriteria(Address.class) 

Welche funktioniert nicht. Ich denke, ich muss durch die Entität gehen, aber dann würde ich eine Art Projektion brauchen?

Criteria.createCriteria(Person.class).<<what goes here???>> 

Vorschläge?

Antwort

6

Die Lebensdauer der Komponente wird von ihrem Besitzer kontrolliert; Sie werden NICHT als Assoziationen betrachtet. Sie können die Komponente daher nicht selbst aus einer Abfrage abrufen. Sie können es jedoch in Kriterien verwenden.

Ihre „Adresse“ Klasse Angenommen wird als „Adresse“ innerhalb „Person“ abgebildet, Sie so etwas wie tun könnte:

Criteria.createCriteria(Person.class) 
.add(Restrictions.eq("address.street", street)); 
+0

Ok, aber wie komme ich eine HQL tun können, und die Adresse direkt abrufen? Warum gilt das nicht für Abfragen? – Konstantin

+0

Da HQL über Funktionen verfügt, die die Kriterien-API nicht erfüllt. Wenn Sie Ihre Adresse wirklich um jeden Preis zurückgeben möchten, können Sie eine Projektionsliste für personenbasierte Kriterien erstellen, die jede Eigenschaft von Address (und nichts anderes) enthalten und "AliasToBeanResultTransformer" auf ein Ergebnis anwenden. Aber das ist eine Menge Kopfschmerzen und nichts dafür zu zeigen; Ich würde stattdessen die vollständige Person auswählen und die Adresse (wenn es das ist, was Sie brauchen) in Java-Code extrahieren. Oder geh mit HQL. – ChssPly76

0

Dies ist, wie man die Eigenschaft des eingebetteten Objekts abrufen oder beziehen kann in den Ruhezustand.

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
       Parent.class,"parent"); 
criteria.createAlias("embeddedObjectFieldName", "parent.embeddedObjectFieldName"); 

criteria.setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("parent.propertyOne")) 
       .add(Projections.max("embeddedObjectFieldName.embeddedobjectproperty"))); 

Hoffnung oben verdeutlicht