2011-08-26 80 views
7

我有以下JPA實體:RIGHT JOIN在JPQL

@Entity 
class UserClient{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
} 

@Entity 
class UserAccess{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @ManyToOne(optional = false, cascade = { CascadeType.REFRESH }) 
    private UserClient user; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date accessTs; 
} 

現在我想運行一個JPQL查詢來獲取用戶的列表以及它們的最後訪問日期。 不幸的是,以下查詢不會返回從未訪問系統的用戶,即存在於UserClient表中,但在UserAccess之一中沒有任何記錄。

SELECT ua.user, MAX(ua.accessTs) FROM UserAccess ua RIGHT JOIN ua.user 

我想念什麼?這是否正確使用RIGHT JOIN?

我使用的是最新的Hibernate JPA版本(4.0.0.CR1)

回答

5

你應該讓UserClient表的關係(這使得更多的邏輯意義IMO)的業主方。然後,您可以使用LEFT JOIN而不是RIGHT JOIN

SELECT uc, MAX(ua.accessTs) FROM UserClient uc LEFT JOIN uc.userAccess ua 

Here's why left join on UserAccess works

SQL left join visual description

+0

你錯過了us.userAccess的UA別名。而且,具有相反的OneToMany關聯就足夠了。沒有必要使它成爲所有者端(這在JPA,BTW中是無法實現的) –

+0

@Matt用戶可以參與許多其他對象,因此對於我來說,這些對象更合理地指向用戶,否則。你認爲我的RIGHT JOIN有什麼問題嗎? –

+0

@JB Nizet感謝您的糾正,我編輯這個匆忙。我自己沒有嘗試過上述查詢。你確定JPA可以像你描述的那樣離開嗎?隨意編輯我的答案,以減少失敗,或者只是發佈你自己的基於我的... –