2009-04-06 6 views
67

Ich möchte Hibernate die Kriterien API verwenden, um eine bestimmte Abfrage zu formulieren, die zwei Entitäten verbindet. Nehmen wir an, ich habe zwei Entitäten, "Pet" und "Owner", mit einem Besitzer, der viele Haustiere hat, aber entscheidend ist, dass die Assoziation nicht in den Java-Annotationen oder in xml abgebildet ist.Hibernate-Kriterien: Join-Tabelle ohne zugeordnete Zuordnung

Mit hql konnte ich Besitzer auswählen, die ein Haustier namens "fido" haben, indem Sie die Verknüpfung in der Abfrage angeben (anstatt eine Gruppe von Haustieren zur Eigentümerklasse hinzuzufügen).

Kann dasselbe mit Hibernate-Kriterien durchgeführt werden? Wenn das so ist, wie?

Danke, J

Antwort

56

Mein Verständnis ist, dass, wenn Sie diese mit HQL tun, führen Sie eine cartesianischen verbinden Erstellen eher mit einem Filter, als eine innere Verknüpfung. Kriterienabfragen unterstützen dies nicht.

+0

David korrekt auf das ist, können Sie dies nicht tun, mit einem Criteria Sie es mit HSQL –

+8

Leider tun können, bekam plötzlich eine downvote auf eine Antwort, die ohne Kommentar oder Erklärung fast vier Jahre alt, ist. Will jemand etwas ausarbeiten? –

+13

Ich gab Ihnen nur eine zufällige Aufwertung, um es wieder gut zu machen –

-1

Es gibt eine SQLCriterion, die Sie beliebig SQL geben können, und fügen Sie Ihre Criteria hinzu. In der Zeichenfolge SQL wird das Token {Alias} "durch den Alias ​​der Root-Entität ersetzt."

+2

wie geht das? irgendein Beispiel? – iPhoneJavaDev

+0

Kein Beispiel oder (mindestens) Link zur Verfügung gestellt. – n3k0

+0

SQLCriterion hat geschützten Konstruktor – AndreyT

1

In NHibernate können Sie Unterabfragen verwenden, die als DetachedCriteria definiert sind. Nicht sicher, ob es das gleiche in Java arbeitet, wahrscheinlich ist es das gleiche:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet") 
    .SetProjection(Projections.Property("pet.ownername")) 
    .Add(/* some filters */); 

session.CreateCriteria(typeof(Owner)) 
    .Add(Subqueries.PropertyIn("name", pets); 

wird angenommen, dass sie den Namen des Besitzers verbunden ist, verwendet wird.

73

Dies ist in der Tat möglich, mit den Kriterien:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class); 
ownerCriteria.setProjection(Property.forName("id")); 
ownerCriteria.add(Restrictions.eq("ownername", "bob")); 

Criteria criteria = getSession().createCriteria(Pet.class); 
criteria.add(Property.forName("ownerId").in(ownerCriteria)); 

aktualisieren: Dies führt tatsächlich eine Unterabfrage statt einer beitreten, aber es ermöglicht es Ihnen, Kriterien auf zwei Einheiten zu verwenden, die keine Hibernate Beziehung haben definiert.

+1

Warum gibt es so viele Up-Stimmen? Es sind immer noch zwei verschiedene Kriterien richtig? – Reddy

+3

Arbeitete perfekt für mich, hier kommt ein up-vote – Avanst

+30

Problem ist, das ist kein Join, aber Unterabfrage - das bedeutet, dass Sie Ihre Ergebnisse nicht nach einer Spalte aus ersten Kriterien ordnen können. –

0
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM Owner WHERE ownerName ='bob'); 
Criteria criteria = getSession().createCriteria(Pet.class); 
criteria.createCriteria("ownerId").add(ownerCriterion);