2012-04-09 9 views
0

Ich bin schrecklich neu zu Hibernate. Ich habe seit zwei Stunden gegoogelt, aber ich kann immer noch nicht herausfinden, wie ich JOIN ohne HQL machen kann, nur nach Kriterien. Ich habe Tabellen Clients (cID, Name) und Besuche (vID, vcID, Datum). Die Beziehung ist eins zu viele (ein Kunde kann mehrere Male besuchen). Ich würde es auch gerne ohne setFetchMode machen. Nur Kriterien. Muss ich das Mapping-XML ändern?Making beitreten mit Kriterien

UPDATE: dies ist ein Teil meiner Mapping xml:

<class name="Client" table="Clients"> 
    <id name="cID" column="cID"><generator class="native"/></id> 
    <property name="name"  length="10" not-null="true"/> 
</class> 
<class name="Visit" table="Visits"> 
    <id name="vID" column="vID"><generator class="native"/></id> 
    <property name="vcID"  length="10" not-null="true"/> 
    <property name="date" length="25" not-null="true"/> 
</class> 
+0

können Sie hier veröffentlichen, was ist Ihre aktuelle Zuordnung und wie Sie versuchen, die Abfrage zu machen? nicht genug Information. –

Antwort

1

Sie müssen Sie Zuordnung aktualisieren:

<class name="Client" table="Clients"> 
    <id name="cID" column="cID"><generator class="native"/></id> 
    <property name="name"  length="10" not-null="true"/> 
    <!-- Declare Set<Visit> visits in the Client class--> 
    <set name="visits" lazy="false" cascade="all"> 
     <key column="vcID"/> 
     <one-to-many class="your.package.Visit"/> 
    </set> 
</class> 
<class name="Visit" table="Visits"> 
    <id name="vID" column="vID"><generator class="native"/></id> 
    <!-- and add "Client client" property to your Visit class --> 
    <many-to-one name="client" column="vcID" lazy="false"/> 
    <property name="date" length="25" not-null="true"/> 
</class> 

Dann:

Criteria criteria = session.createCriteria(Visit.class).addCriteria("client") 
         .add(Restriction.eq(...)); 

oder

Criteria criteria = session.createCriteria(Client.class).addCriteria("visits") 
         .add(Restriction.eq(...)); 

Und Hibernate sie automatisch verbinden.

+0

vielen dank, endlich klappt es! – user1091733

3

eine Klasse Client mit einer Liste-Attribut "Besuche" Nachdem die Zuordnung Ihres Visit-Entity:

Criteria criteria = session.createCriteria(Client.class); 
criteria.addCriteria("visits"); 

Diese würde einen inneren Join zwischen Ihrer Client-Tabelle und Ihrer Besuchs-Tabelle erstellen.

Update:

Hier finden Sie einige gute Beispiele finden: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-associations

Mapping Beispiel

ich so gut wie nie verwenden Hibernate XML-Mapping, aber es sollte ähnlich zu lesen:

<class name="Client" table="Clients"> 
     <id name="cID" column="cID"><generator class="native"/></id> 
     <property name="name"  length="10" not-null="true"/> 

     <bag name="visits"> 
      <key column="vcId"/> 
      <one-to-many class="Visit"/> 
     </bag> 
    </class> 

Tell Hiber Es gibt eine Eigenschaft "Besuche", die eine Eins-zu-viele-Beziehung darstellt.

+0

Aber wie löst man das ohne spezielle Listenattribute "Besuche"? Ich suche nach Äquivalent für "SELECT Name FROM Clients JOIN Besuche ON vcID = cID". Im ersten Post habe ich mein Mapping xml abgelegt. Sollte ich da etwas ändern? – user1091733

+0

Ja, Ihre Client-Klasse benötigt eine Collection-Zuordnung zu Ihrer Visits-Klasse, insb. Definition der 1-n-Beziehung, siehe [link] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html#collections-mapping) – PepperBob

+0

Also, wenn ich eine solche Liste implementiert (private List visits = new ArrayList();), was soll ich zum Mapping xml hinzufügen? Dieses Dokument ist nicht sehr klar für mich. – user1091733