2009-10-30 9 views
6

Gli esperti di java possono aiutarmi a scrivere query indipendenti come parte della query dei criteri per la seguente istruzione SQL.Sospendi le query separate come parte della query dei criteri

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 

risposta

14

è necessario scrivere un correlated subquery. Supponendo che i nomi di proprietà/classe corrispondano ai nomi di colonna/tabella sopra:

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

Solo una aggiunta alla query precedente. Se l'entryid non è la chiave primaria, sarà necessario aggiungere la proiezione.

 

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

Stavo facendo qualcosa di molto simile e avevo bisogno della proiezione. – jnrcorp

Problemi correlati