【问题标题】:Sub-queries in associations with hibernate与休眠关联的子查询
【发布时间】:2012-06-16 23:07:22
【问题描述】:

任何人都知道是否可以在如下查询这样的关联中使用子查询?

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

但我真的认为这不是一个好的解决方案,有什么建议吗?

【问题讨论】:

    标签: java hibernate jpa hql


    【解决方案1】:

    另一种选择是在另一个查询中创建子查询,使用 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...
    

    也许这对你有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多