【发布时间】:2015-04-14 14:11:26
【问题描述】:
我有以下场景
@Entity
public class Parent {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy = "parent", orphanRemoval = true)
private Set<Child> children;
}
@Entity
public class Child {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch=FetchType.LAZY, optional = false)
private Parent parent;
}
使用 JPA Criteria 或 JPQL 构建查询时,在请求子项的联接提取时,默认情况下会获得内部联接。
通过使用:
SELECT p from Parent p JOIN p.children
或
EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Parent> query = cb.createQuery(Parent.class);
Root<Parent> root = query.from(Parent.class);
root.fetch(Parent_.children);
query.distinct(true);
List<Parent> result = em.createQuery(query).getResultList();
如何避免这种默认行为(内连接)? 我的目标是在指定 OneToMany 关系时默认获得 LEFT JOIN ...... 是否可以在构建查询时不显式设置 JoinType.LEFT?
非常感谢任何帮助。 提前谢谢你
【问题讨论】:
标签: java hibernate jpa one-to-many criteria-api