gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:40:58 24 4
gpt4 key购买 nike

我使用的是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com