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
你错过了us.userAccess的UA别名。而且,具有相反的OneToMany关联就足够了。没有必要使它成为所有者端(这在JPA,BTW中是无法实现的) –
@Matt用户可以参与许多其他对象,因此对于我来说,这些对象更合理地指向用户,否则。你认为我的RIGHT JOIN有什么问题吗? –
@JB Nizet感谢您的纠正,我编辑这个匆忙。我自己没有尝试过上述查询。你确定JPA可以像你描述的那样离开吗?随意编辑我的答案,以减少失败,或者只是发布你自己的基于我的... –