2014-09-27 86 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