Hibernate Verein mit createCriteria und createAlias
Habe ich zwei einfache mapings:
<class name="org.testing.Person" table="PERSON">
<id name="personId" type="long" column="PERSON_ID">
<generator class="native"/>
</id>
<property name="personName" type="string" not-null="true" column="PERSON_NAME"/>
<many-to-one name="personAddress" class="org.testing.Address" column="PERSON_ADDRESS" not-null="true" cascade="all" unique="true"/>
</class>
und
<class name="org.testing.Address" table="ADDRESS">
<id name="addressId" type="long" column="ADDRESS_ID">
<generator class="native" />
</id>
<property name="street" column="ADDRESS_STREET" type="string" />
<property name="city" column="ADDRESS_CITY" type="string" />
<property name="state" column="ADDRESS_STATE" type="string" />
</class>
Ich versuche zu bekommen-Eigenschaft der person-Adresse wie folgt:
session.createCriteria(Person.class)
.add(Restrictions.eq("personName", "Frodo"))
.createAlias("personAddress", "pa")
.setProjection(Projections.property("pa.street"))
.list();
und es funktioniert.
Als wie diese:
session.createCriteria(Person.class)
.add(Restrictions.eq("personName", "Frodo"))
.createCriteria("personAddress")
.setProjection(Projections.property("street"))
.list();
und es wirft: org.hibernate.QueryException: could not resolve property: street of: org.testing.Person
. Ich nehme an, beide sollten das gleiche Ergebnis. Wo bin ich falsch?
Vielen Dank im Voraus!
Warum sind Sie mit createCriteria("personAddress") in der zweiten Abfrage?
Ich benutze es, weil es eine Eigenschaft namens personAddress in Person, Klasse und es ist ein Ende der Assoziation der Adresse Klasse
Ich benutze es, weil es eine Eigenschaft namens personAddress in Person, Klasse und es ist ein Ende der Assoziation der Adresse Klasse
InformationsquelleAutor catdog | 2012-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
.setProjection(Projections.property("street"))
arbeitet stets auf der root-Kriterien. zum Projekt schlossen sich Positionen, die Sie haben, auf die erste version, die Sie veröffentlicht.InformationsquelleAutor Firo
hibernate 3.3.2;
lassen Sie uns sehen, code Quelle :
createCriteria return sub-Kriterien ,so dass alle der operation sub-Kriterien ;
aber createAlias ist Rückkehr die Kriterien, erstellen von sub-Kriterien ;
Beispiel 1.
Ad manyToone adgroup, die alle " Namen "Eigenschaften
lassen Sie uns sagen, den Namen in adgroup ist "aaaa"
der name in der Anzeige "bbbb"
in der ersten Anweisung , "name" value Ergebnis aus der adGroup entity = " aaaa ".
in der zweiten Aussage , "name" value Ergebnis aus Ad Entität "bbbb" .
ps1: wenn es keine "name" - Eigenschaften in adgroup Einheit ,sondern in ad Entität, die erste Anweisung throw Exception: org.hibernate.QueryException: could not resolve property: name: AdGroup ;
aber wenn u zu ändern " .setProjection(Projektionen.Eigenschaft("ad.name")) ",es wird in Ordnung sein, die Rückgabe der Wert der ad-name
ps2 :erste Anweisung call-Liste() von criteria2 ,aber hibernate wird der Prozess von der root-Kriterien = criteria1 ; so dass die endgültige sql enthalten", wo ad.id =343909 " von criteria1 ;
Beispiel 2.
Lehrer oneToMany student
student oneToMany student
zweite Anweisung throw Exception: org.hibernate.QueryException: could not resolve property: Bücher: Lehrer;
weil Bücher eine Eigenschaft von student
, dass ist der Unterschied zwischen createCriteria und createAlias ;
InformationsquelleAutor phil