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;
}

现在我想运行一个 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

关于jpa - JPQL 中的右连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210269/

相关文章:

java - 这个 JPQL 查询有什么问题?

java - 在JPA中获取单行

java - Persistence.createEntityManagerFactory() 在哪里寻找持久性单元?

Hibernate/JPA - 可以同时使用@Id 和@EmbededId 吗?

jpa - 无法使用 @PersistenceContext 注入(inject) RESOURCE_LOCAL 容器管理的 EntityManager

java - HQL:如何通过id查找子集合中的项目

java - 如何从 Hibernate session 中删除不需要的实体?

java - 为什么 Spring 的 @Configurable 有时有效,有时无效?

hibernate - JPQL/HQL 和 JPA/Hibernate : boolean expression in select constructor expression not working (unexpected AST node: AND, NPE、HqlSqlWalker.setAlias)?

java - 排除带有 JPQL "not in"的项目