2012-05-11 13 views
2

に追加の制限を加える:Criteria.listで実行するとHibernateの基準:私は休止状態(3.5)基準クエリを作成しているRestrictions.isEmpty

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

、Hibernateは(読みやすさのために簡略化)は、次の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

はい、それはサブクエリを使用して、可能です:

次のHQLクエリーのと同じです
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)); 

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) 
関連する問題