2012-06-13 157 views
2

任何人都知道是否可以在像這個查詢下面的關聯中使用子查詢?與休眠相關聯的子查詢

SELECT l, o 
FROM User u 
    INNER JOIN u.licenses l 
    LEFT JOIN l.orders o 
     WITH o.id = (
      SELECT MAX(lastOrder.id) 
      FROM Order lastOrder 
      WHERE lastOrder.license = l 
     ) 
WHERE u.idtPerson = :idtPerson 
    AND l.statusCode != 3 

我發現這個解決辦法...

SELECT l, o 
FROM User u 
    INNER JOIN u.licenses l 
    LEFT JOIN l.orders o 
WHERE u.idtPerson = :idtPerson 
    AND l.statusCode != 3 
    AND (
     o.id IS NULL 
     OR o.id = (
      SELECT MAX(lastOrder.id) 
      FROM Order lastOrder 
      WHERE lastOrder.license = l 
     ) 
    ) 

但我真的相信這不是一個很好的解決方案,有什麼建議?

回答

0

另一種選擇是在另一個查詢中創建子查詢,並將其列入maxresults = 1,並通過參數將其傳遞給原始查詢。

事情是這樣的:

Query hqlQuery = session.createQuery("SELECT MAX(lastOrder.id) 
             FROM Order lastOrder 
             WHERE lastOrder.license = l");  
hqlQuery.setMaxResults(1); 
List results = hqlQuery.list(); 
Integer maxId = null; 
if (!results.isEmpty()){ 
    maxId = results.get(0); 
} 
Query hqlQuery1 = session.createQuery("SELECT l, o 
             FROM User u 
             INNER JOIN u.licenses l 
             LEFT JOIN l.orders o 
             WITH o.id = :maxId 
             WHERE u.idtPerson = :idtPerson 
             AND l.statusCode != 3"); 
hqlQuery1.setParameter("maxId", maxId); 
hqlQuery1.list(); 
...etc... 

也許這會爲你

工作