【问题标题】:JPQL OUTER JOINJPQL 外连接
【发布时间】:2014-11-22 16:08:09
【问题描述】:

我有以下实体:

@Entity
public class Node {

    @Id
    private int id;
    @Column
    private String name;
    //getters, setters
}

@Entity
public class Message {

    @Id
    private int id;
    @Column
    private String message;
    @Column
    private Date timeStamp
    @ManyToOne
    private Node node;
    //getters, setters
}

现在假设我有 3 个节点(N1、N2、N3)。 N1 和 N2 有消息,而 N3 没有任何消息 我想要的结果表如下:

| Node | Last Message |
-----------------------
| N1   | 2014-05-26   |
| N2   | 2014-05-23   |
| N3   |              |
-----------------------

所以基本上我想要一个 JPQL 查询,它返回按每个 Node 分组的最新 Message, 还可以显示没有任何消息的节点。 到目前为止,我有以下查询,但没有给出预期的结果:

select 
    nod.name,
    msg.timeStamp 
from 
    Node nod, 
    Message msg
where
    msg.timeStamp IN 
        (select 
            max(ms.timeStamp) 
         from 
            Message ms 
         group by 
            ms.node) 

我可能在上面的某个地方错过了一个连接,但不确定。

【问题讨论】:

    标签: hibernate jpa jpql


    【解决方案1】:

    JPQL 不允许未定义关系的连接,但允许右外连接,因此您可以像这样进行查询;

    select 
        nod.name,
        Max(msg.timeStamp) 
    from 
        Message msg
    right join
        msg.node nod
    group by 
        nod.name; 
    

    希望对你有帮助。

    【讨论】:

    • Ah 仍在使用 jpa 2.0,但由于使用正确的连接而出现 IDE 错误。升级到 2.1 就可以了 :)
    • 哦,太好了。我忘记提了。对不起。
    猜你喜欢
    • 2012-01-08
    • 2014-08-08
    • 2016-01-22
    • 2016-05-13
    • 2016-03-10
    • 2012-10-25
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多