web-dev-qa-db-ger.com

Kriterien für den Ruhezustand: Verbindungstabelle ohne zugeordnete Zuordnung

Ich möchte die Kriterien-API von Hibernate 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 diese Assoziation nicht in den Java-Annotationen oder XML-Dateien abgebildet wird.

Mit hql konnte ich Besitzer auswählen, die über ein Haustier namens "fido" verfügen, indem Sie den Join in der Abfrage angeben (anstatt der Besitzerklasse einen Satz von Haustieren hinzuzufügen).

Kann das Gleiche mit den Kriterien für den Ruhezustand getan werden? Wenn das so ist, wie?

Danke, J

69
Snukker

Ich verstehe das so, wenn Sie dies mit HQL tun, erstellen Sie einen kartesischen Join mit einem Filter und nicht mit einem Inner Join. Kriterienabfragen unterstützen dies nicht.

59
David M

Dies ist in der Tat mit folgenden Kriterien möglich:

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));

Update : Dies führt tatsächlich eine Unterabfrage anstelle eines Joins durch, aber Sie können Kriterien für zwei Entitäten verwenden, für die keine Hibernatbeziehung definiert ist.

77

In NHibernate können Sie Unterabfragen verwenden, die als DetachedCriteria definiert sind. Nicht sicher, ob es in Java gleich funktioniert, höchstwahrscheinlich ist es dasselbe:

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

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

Angenommen, es wird der Name des Eigentümers hinzugefügt.

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