2014-05-07 10 views
17

Ich kann keine Lösung für ein Problem finden, das scheint einfach zu sein. Sagen, es gibt 2 Entitätsklassen:Hibernate-Kriterien mit existiert Klausel

class A { 
    Set<B> bs; 
} 

class B { 
    String text; 
} 

Wie eine Kriterien-Abfrage erstellen, die alle Einsen zurückgibt, die mindestens eine B Einheit enthält, die eine bestimmte Bedingung erfüllt (wie b.text = ‚Bedingung‘)?

Antwort

26

Ich denke, diese Verbindung nützlich sein kann: http://mikedesjardins.net/2008/09/22/hibernate-criteria-subqueries-exists/

Es enthält das folgende Beispiel darüber, wie schaffen n Kriterien besteht:

„Was sind Sie wirklich versuchen zu tun ist, alle Pizzen Aufträge zu erhalten, in dem . eine zugehörige kleine Pizza gibt es in anderen Worten, die SQL-Abfrage, die Sie emulieren möchten, ist

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) 

die Art und Weise, dass Sie das tun, ist durch die Verwendung eines „existiert“ Subquery, wie folgt aus:

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

Und voila, das Ergebnis wird zwei PizzaOrders enthalten! "

+9

Können Sie bitte Ihren Beitrag bearbeiten, um die relevanten Bits einzuschließen, damit die Antwort immer noch Wert hat, wenn die Verbindung ausfällt? – mabi