2012-05-11 42 views
2

我已經創建了一個休眠(3.5)搜索標準查詢:休眠標準:添加額外的限制Restrictions.isEmpty

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

當與Criteria.list執行,休眠產生以下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) 

這可能使用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)