2009-07-17 9 views
0

Ich habe eine Klasse Order, die einen OrderSection-Satz enthält, der selbst einen OrderItem-Satz enthält.HQL-Unterabfragen in Joins

In SQL kann man eine SELECT-Anweisung in einer JOIN-Klausel verwenden, wie in der folgenden Abfrage durchgeführt:

SELECT 
    o.id, 
    o.amount, 
    sum(s.quantity*s.price), 
    sum(s.quantity*i.price) 
FROM 
    orders AS o 
    JOIN ordersections AS s ON s.order_id=o.id 
    JOIN (SELECT section_id, sum(quantity*price) AS price FROM orderitems GROUP BY section_id) AS i ON i.section_id=s.id 
GROUP BY o.id, o.amount 

Wäre es möglich, eine solche Abfrage in HQL auszudrücken?

Antwort

2

Es sei denn, ich bin etwas fehlt, können Sie Ihre Abfrage wie in SQL neu geschrieben werden:

SELECT 
    o.id, 
    o.amount, 
    sum(s.quantity*s.price), 
    sum(s.quantity*i.quantity*i.price) 
FROM orders AS o 
    JOIN ordersections AS s ON s.order_id=o.id 
    JOIN orderitems AS i ON i.section_id=s.id 
GROUP BY o.id, o.amount 

In diesem Fall kann es dann wie in HQL neu geschrieben werden:

SELECT 
    o.id, 
    o.amount, 
    sum(s.quantity*s.price), 
    sum(s.quantity*i.quantity*i.price) 
FROM orders AS o 
    JOIN o.sections AS s 
    JOIN s.items AS i 
GROUP BY o.id, o.amount 

Wenn ich vermisst etwas und die obige Abfrage gibt nicht zurück, was Sie wollen, Sie haben kein Glück mit HQL-Konvertierung, weil Subqueries in HQL can only occur in SELECT or WHERE clauses. Sie können jedoch Ihre Abfrage als <sql-query> abbilden - sollte am Ende keinen Unterschied machen.

+0

Dies führt nicht zu den gleichen Ergebnissen, da die dritte Spalte nicht vom Element abhängig ist und so oft wiederholt wird, wie in jedem Abschnitt Elemente vorhanden sind. Teilen durch count (*) sollte aber den Trick tun, also danke für Ihre Hilfe. –