web-dev-qa-db-ja.com

exists句のある休止状態基準

簡単に思える問題の解決策が見つかりません。 2つのエンティティクラスがあるとします。

class A {
   Set<B> bs;
}

class B {
   String text;
}

特定の条件を満たす少なくとも1つのBエンティティを含むすべてのAを返す条件クエリを作成する方法(b.text = 'condition'など)?

20
meliniak

このリンクは役に立つと思います: http://mikedesjardins.net/2008/09/22/hibernate-criteria-subqueries-exists/

これには、create n exists基準に関する次の例が含まれています。

「実際に実行しようとしているのは、関連する小さなピザが存在するすべてのピザ注文を取得することです。つまり、エミュレートしようとしているSQLクエリは

SELECT *
  FROM PIZZA_ORDER
 WHERE EXISTS (SELECT 1
                 FROM PIZZA
                WHERE PIZZA.pizza_size_id = 1
                  AND PIZZA.pizza_order_id = PIZZA_ORDER.pizza_order_id)

その方法は、次のように「存在する」サブクエリを使用することです。

Criteria criteria = Criteria.forClass(PizzaOrder.class,"pizzaOrder");
DetachedCriteria sizeCriteria = DetachedCriteria.forClass(Pizza.class,"pizza");
sizeCriteria.add("pizza_size_id",1);
sizeCriteria.add(Property.forName("pizza.pizza_order_id").eqProperty("pizzaOrder.pizza_order_id"));
criteria.add(Subqueries.exists(sizeCriteria.setProjection(Projections.property("pizza.id"))));
List<pizzaOrder> ordersWithOneSmallPizza = criteria.list();

そして出来上がり、結果には2つのPizzaOrdersが含まれます!」

31
Lucia Manescau