hibernate - 如何使用 JPA CriteriaBuilder 查询执行外连接?

标签 hibernate jpa join jpa-2.0 outer-join

我使用的是 JPA 2.0、Hibernate 4.1.0.Final 和 MySQL 5.5.27。我想构建一个 JPA 查询,每行返回两个实体,我想执行一个正确的外连接。这两个实体是:

@Entity
@Table(name = "user",
    uniqueConstraints = { @UniqueConstraint(columnNames = { "USER_NAME" }) }
)
public class User implements Comparable<User>, Serializable
{
    ...
    @Column(name = "first_name")
    @NotNull
    /* the first name of the User */
    private String firstName;


@Entity
@Table(name="code_user",
    uniqueConstraints = { 
        @UniqueConstraint(columnNames = { "CODE_ID", "USER_ID" }) }
)
public class CodeUser 
{

    @Id
    @NotNull
    @GeneratedValue(generator = "uuid-strategy")
    @Column(name = "ID")
    private String id;

    @ManyToOne
    @JoinColumn(name = "CODE_ID", nullable = false, updatable = true)
    private Code code;

    @ManyToOne
    @JoinColumn(name = "USER_ID", nullable = false, updatable = true)
    private User user;

到目前为止,这是我的 JPA,但问题是正在执行内部联接,并且每行仅返回一个实体(用户对象)......
    final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
    final CriteriaQuery<User> criteria = builder.createQuery(User.class);
    final Root<User> user = criteria.from(User.class);

    final Root<CodeUser> codeUser = criteria.from(CodeUser.class);
    final Join<CodeUser, User> joinUser = codeUser.join(CodeUser_.user);
    criteria.select(joinUser);
    …
    return criteria.where(builder.and(preds.toArray(new Predicate[preds.size()])));

如何执行外部联接以便返回所有用户并返回任何匹配的 CodeUser 记录?向我的用户实体添加额外的成员字段不是一个选项。

最佳答案

你必须检查Hibernate是否支持Right Join,因为根据documentation JPA provider不需要支持RIGHT JOIN :

Right outer joins and right outer fetch joins are not required to be supported in Java Persistence 2.0. Applications that use RIGHT join types will not be portable.



所以,所以,如果你发现没有 hibernate 版本,我看到的唯一解决方案是:

解决方案 1。将 LAZY 字段添加到 User实体
@OneToMany(mappedBy="TODO", fetch=FetchType.LAZY)
private Collection<CodeUser> codeUsers;

然后使用 LEFT JOIN 从 User 导航到 CodeUsers。

解决方案 2。进行两个不同的查询:第一个获取所有用户,第二个获取相应的 CodeUser。

关于hibernate - 如何使用 JPA CriteriaBuilder 查询执行外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795016/

相关文章:

hibernate - 如何在 hibernate 中使用 HAVING COUNT(*)

java - ArrayList 项和 hibernate 的问题

mysql - 如何在 Spring MVC 中使用 SQL 实现审计跟踪?

mysql - 在 MySQL 中加入一个 Select Distinct 通过连接表重新排序

python - 尝试将列表条目添加到字符串时出现 "TypeError: can only join an iterable"

mysql - Hibernate,发生异常后不刷新Session问题

java - Junit Hibernate 多次创建数据库模式

java - Hibernate 替换字符串条件

java - 具有组合键的 JPA OneToMany 和 ManyToOne 正在生成第三个表

java - Hibernate 在 save() 操作期间调用子实体的更新,而调用父实体的插入