Подтвердить что ты не робот

Спящий критерий с условием существования

Я не могу найти решение проблемы, которая кажется легкой. Скажем, есть 2 класса сущностей:

class A {
   Set<B> bs;
}

class B {
   String text;
}

Как создать запрос критериев, который возвращает все A, содержащие хотя бы один объект B, который выполняет заданное условие (например, b.text = 'condition')?

4b9b3361

Ответ 1

Я думаю, что эта ссылка может быть полезна: http://mikedesjardins.net/2008/09/22/hibernate-criteria-subqueries-exists/

Он содержит следующий пример о том, как создавать n существующих критериев:

"То, что вы действительно пытаетесь сделать, это получить все заявки на пиццу, где существует связанная небольшая пицца. Другими словами, 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();

И вуаля, результат будет содержать два PizzaOrders! "