3

Hibernate (3.5) Criteria クエリを作成しました。

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

Criteria.list で実行すると、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 を使用しています)。

4

1 に答える 1

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)
于 2012-05-11T11:37:59.530 に答える