2012-05-11 4 views
2
에 추가 제한을 추가

나는 하이버 네이트 (3.5) 기준 쿼리 만들었습니다 Criteria.list으로 실행되면최대 절전 모드 기준 : Restrictions.isEmpty

Criteria criteria = db.getSession().createCriteria(Vendor.class); 
criteria.add(Restrictions.isEmpty("models")); 

는, 최대 절전 모드는 다음과 같은 SQL을 생성 (가독성을 위해 간소화를) :

SELECT this_.* 
FROM VENDOR this_ 
     left outer join MODEL models1_ 
     ON this_.id = models1_.VENDOR_ID 
WHERE NOT EXISTS (SELECT 1 
        FROM MODEL 
        WHERE this_.id = VENDOR_ID) 

는 내가 뭘하려는 SQL 쿼리이

 
SELECT this_.* FROM VENDOR this_ 
left outer join MODEL models1_ 
     ON this_.id = models1_.VENDOR_ID 
WHERE 
NOT EXISTS (SELECT 1 
          FROM MODEL 
          WHERE this_.id = VENDOR_ID AND DEPRECATED = 0) 

,369과 같을 것이다 있도록 "없는 존재"부분에서 제한을 추가입니다

Hibernate Criteria API를 사용하면 가능합니까? 그렇다면, 어떻게 할 수 있습니까? 아니면 동일한 결과를 얻을 수있는 다른 가능성이 있습니다 (하지만 여전히 Criteria API 사용).

답변

14

예, 서브 쿼리 사용 가능 :

Criteria criteria = db.getSession().createCriteria(Vendor.class, "vendor"); 

DetachedCriteria dc = DetachedCriteria.forClass(Vendor.class, "vendor2"); 
dc.createAlias("vendor2.models", "model"); 
dc.add(Restrictions.eq("model.deprecated", 0)); 
dc.add(Restrictions.eqProperty("vendor2.id", "vendor.id")); 
dc.setProjection(Projections.id()); 

criteria.add(Subqueries.notExists(dc)); 

다음 HQL 질의하는 것과 동일합니다 :

select vendor from Vendor vendor 
where not exists(select vendor2.id from Vendor vendor2 
       inner join vendor2.models model 
       where model.deprecated = 0 
       and vendor2.id = vendor.id)