2009-10-30 12 views
6

Czy możesz pomóc mi pisać odszyfrowane zapytania jako część zapytania o kryteria dla następującej instrukcji SQL.Odłączone zapytania Hibernate w ramach zapytania o kryteria

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 

Odpowiedz

14

Musisz napisać correlated subquery. Zakładając, że nazwy właściwości/klas odpowiadają nazwom kolumn/tabel powyżej:

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

Tylko jedno dodanie do powyższego zapytania. Jeśli entryid nie jest kluczem podstawowym, musisz dodać rzutowanie.

 

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

Robiłem coś bardzo podobnego i potrzebowałem projekcji. – jnrcorp