2009-10-30 8 views
6

Javaの専門家は、次のSQLステートメントの条件クエリの一部として分離クエリを書くのを助けてください。条件クエリの一部としてHibernate detachedクエリ

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 

答えて

14

correlated subqueryを書く必要があります。プロパティ/クラス名が上記の列/テーブル名と一致すると仮定します。

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

上記のクエリに1つだけ追加します。 entryidが主キーでない場合は、投影を追加する必要があります。

 

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

私は非常に似たようなことをしていて、投影が必要でした。 – jnrcorp