2009-10-30 6 views
6

Java-Experten können Sie mir bitte helfen, abgetrennte Abfragen als Teil der Kriterienabfrage für die folgende SQL-Anweisung zu schreiben.Hibernate abgetrennte Abfragen als Teil der Kriterienabfrage

select A.* 
FROM AETABLE A 
where not exists 
(
    select entryid 
    FROM AETABLE B 
    where B.classpk = A.classpk 
    and B.userid = A.userid 
    and B.modifiedDate > A.modifiedDate 
) 
and userid = 10146 

Antwort

14

Sie müssen eine correlated subquery schreiben. Unter der Annahme, dass die Eigenschaften/Klassennamen den obigen Spalten/Tabellennamen entsprechen:

DetachedCriteria subquery = DetachedCriteria.forClass(AETable.class, "b") 
.add(Property.forName("b.classpk").eqProperty("a.classpk")) 
.add(Property.forName("b.userid").eqProperty("a.userid")) 
.add(Property.forName("b.modifiedDate").gtProperty("a.modifiedDate")); 

Criteria criteria = session.createCriteria(AETable.class, "a") 
.add(Property.forName("userid").eq(new Integer(10146))) 
.add(Subqueries.notExists(subquery); 
6

Nur eine Ergänzung zu der obigen Abfrage. Wenn die Eingabekennung nicht der Primärschlüssel ist, müssen Sie eine Projektion hinzufügen.

 

DetachedCriteria subquery = DetachedCriteria.forClass(AETable.class, "b") 
.add(Property.forName("b.classpk").eqProperty("a.classpk")) 
.add(Property.forName("b.userid").eqProperty("a.userid")) 
.add(Property.forName("b.modifiedDate").gtProperty("a.modifiedDate")) 
.add(setProjection(Projections.property("entryId")); // Additional projection property 

Criteria criteria = session.createCriteria(AETable.class, "a") 
.add(Property.forName("userid").eq(new Integer(10146))) 
.add(Subqueries.notExists(subquery); 

 
+0

Ich tat etwas sehr ähnliches und brauchte die Projektion. – jnrcorp

Verwandte Themen