2014-09-27 87 views
0

我有以下实体:JPQL OUTER JOIN

@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查询returnsthe最新Message每个Node分组, 也显示没有任何消息的节点。 到目前为止我有以下查询其犯规得到期望的结果:

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) 

我可能错过了参加地方在那里,但不能确定。

回答

1

JPQL不允许没有定义关系的连接,但允许右外连接,所以你可以这样做你的查询;

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

希望它有帮助。

+0

啊仍然使用jpa 2.0,并得到使用正确的连接IDE错误。升级到2.1,它的工作:) – ChrisGeo 2014-09-28 16:24:10

+0

哦,很好,你认为它。我忘记提及这一点。 Sry基因。 – 2014-09-28 19:27:53