JPQL中的正确加入

时间:2011-08-26 20:31:36

标签: 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;
}

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

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

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

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

1 个答案:

答案 0 :(得分:6)

你应该让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