2012-09-05 20 views
6

Ich versuche, die Ergebnismenge der Abfrage der Hibernate-Kriterien nach Ergebnis einer anderen Abfrage einzuschränken. Ich weiß, wie man dieses Problem mit JPQL löst:Verengung des Ergebnisses der Abfrage nach Unterabfrage

Aber ich kann mir nicht vorstellen, wie man solche Abfrage mit Kriterien machen. Irgendwelche Ideen, wie man diese Auswahl mit Kriterien implementiert? Hibernate 3.3 wird verwendet.

UPD: Der Versuch, dieses Problem zu lösen ich die folgenden Kriterien Abfrage gemacht haben:

Criteria resultCriteriaQuery = this.hibernateSession.createCriteria(DocPackage.class, "pack"); 
     DetachedCriteria personSubquery = DetachedCriteria.forClass(Person.class, "pers"). 
      add(Restrictions.like("pers.loFstLstName", "%" + searchObject.getApplicant().toLowerCase() + "%")). 
      add(Restrictions.eqProperty("itm.objectId", "pers.id")); 
     DetachedCriteria applicantsSubquery = DetachedCriteria.forClass(ObjectGroup.class, "objGrp"). 
      add(Restrictions.eqProperty("pack.applcantGroup", "objGrp")). 
      createAlias("objGrp.items", "itm"). 
      add(Restrictions.eq("itm.objectClass", "org.cp.model.common.Person")). 
      add(Subqueries.exists(personSubquery)); 
     resultCriteriaQuery.add(Subqueries.exists(applicantsSubquery)); 

Aber es funktioniert nicht. Ich habe eine NullPointerException auf resultCriteriaQuery.list(). Was ist falsch an dieser Abfrage? Irgendwelche Ideen?

Antwort

0

den Fall ein wenig besser zu analysieren, es gibt die Anweisung HQL automatisch aus den Kriterien erzeugt, haben Sie in den Verbindungseigenschaften setzen winter:

<property name="hibernate.show_sql" value="true" /> 
<property name="hibernate.format_sql" value="true" /> 

und das Protokoll zu debuggen.

Sobald Sie es haben, können Sie vergleichen, mit denen Sie die Unterschiede generieren und anzeigen möchten.

Grüße,

0

Sie können mit dem Criteria.createCriteria(String) Methode Unterkriterien erstellen.

Angenommen, das folgende Szenario:

Klasse B hat einen Namen: String.

Klasse A hat Elemente: Set.

Sie wollen jetzt (abgesehen von anderen Einschränkungen) nur A-Objekte, bei denen es einen B mit name = "X" ist:

Criteria crit = session.createCriteria(A.class); 
<add your restrictions for A> 

Criteria narrow = crit.createCriteria("elements"); 
narrow.add(Restrictions.eq("name", "X"); 

// This will respect the constraints applied to narrow 
crit.list(); 
0

Non-assoziierte Joins werden nicht von Hibernate Criteria API unterstützt. Diese Zeile ist ein Problem:

FROM ObjectGroup g JOIN g.items i, Person per 

Von dem, was ich sehe, werden Sie eine explizite Zuordnung zwischen ObjectGroupItem und Person erstellen müssen. Dies kann mit Hibernate @ Any Annotation erreicht werden. Werfen Sie einen Blick auf Hibernate Annotations, Absatz 2.4.5.2. Wenn die Zuordnung zugeordnet wird, verwenden Sie Criteria # createCriteria() oder Criteria # createAlias ​​(), um der Unterabfrage die erforderlichen Verknüpfungen hinzuzufügen. Sie verwenden bereits die richtige API, um der Hauptabfrage eine Unterabfrage hinzuzufügen.

Verwandte Themen