jpa – JPQL中的正确加入

前端之家收集整理的这篇文章主要介绍了jpa – JPQL中的正确加入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下JPA实体:
@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;
}@H_301_3@ 
 

现在我想运行一个JPQL查询获取上次访问日期的用户列表.
遗憾的是,以下查询不会返回从未访问过系统的用户,即存在于UserClient表中,但在UserAccess表中没有任何记录.

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

我错过了什么吗?正确使用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@H_301_3@ 
 

Here’s why left join on UserAccess works

猜你在找的Java相关文章