web-dev-qa-db-fra.com

hiberner les critères avec la clause existe

Je ne trouve pas de solution à un problème qui semble facile. Supposons qu'il existe 2 classes d'entités:

class A {
   Set<B> bs;
}

class B {
   String text;
}

Comment créer une requête de critères qui renvoie tous les A qui contiennent au moins une entité B qui remplit une condition donnée (comme b.text = 'condition')?

20
meliniak

Je pense que ce lien peut être utile: http://mikedesjardins.net/2008/09/22/hibernate-criteria-subqueries-exists/

Il contient l'exemple suivant sur la façon dont create n existe des critères:

"Ce que vous essayez vraiment de faire, c'est d'obtenir toutes les commandes de pizza contenant une petite pizza associée. En d'autres termes, la requête SQL que vous essayez d'émuler est

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)

Pour ce faire, vous utilisez une sous-requête "existe", comme ceci:

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();

Et voila, le résultat contiendra deux PizzaOrders! "

31
Lucia Manescau