2009-10-30 81 views
6

java专家能否请您帮助我将分离查询编写为以下SQL语句的条件查询的一部分。休眠分离查询作为条件查询的一部分

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

只是对上述查询的一个补充。如果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 2013-05-09 15:19:34