RIGHT JOIN在JPQL

问题描述:

我有以下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)

你应该让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可以像你描述的那样离开吗?随意编辑我的答案,以减少失败,或者只是发布你自己的基于我的... –