2012-06-13 40 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... 

也许这会为你

工作