JPQL中的正确加入

Gen*_*her 8 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;
}
Run Code Online (Sandbox Code Playgroud)

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

SELECT ua.user, MAX(ua.accessTs) FROM UserAccess ua RIGHT JOIN ua.user
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?这是正确使用RIGHT JOIN吗?

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

Mat*_*all 6

您应该使UserClient表格成为关系的所有者方面(这使IMO更具逻辑意义).然后你可以使用a LEFT JOIN而不是a RIGHT JOIN.

SELECT uc, MAX(ua.accessTs) FROM UserClient uc LEFT JOIN uc.userAccess ua
Run Code Online (Sandbox Code Playgroud)

这就是为什么离开加入UserAccess工作:

SQL左连接可视化描述