Hibernate FetchMode = Join不起作用

时间:2015-09-30 19:30:48

标签: hibernate jpa join criteria-api

我看到即使使用FetchMode = JOIN

,Hibernate也会触发多个查询

以下是我的实体类

 @Entity
 @Table(name = "person")
 public class PersonJPA{
  @Id
  @Column(name = "person_id")
  @GeneratedValue
  private Long personId;

  @OneToMany(mappedBy = "personId",cascade=CascadeType.ALL)
  @Fetch(value = FetchMode.JOIN)
  private Set<AddressJPA> address;
  ......
 }

 @Table(name = "address")
 public class AddressJPA {

  @Id
  @Column(name = "address_id")
  @GeneratedValue
  private long addressId;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "person_id")
  private PersonJPA personId;

 }

如何编写JPA CriteriaQuery,为给定的personId选择具有AddressJPA列表的PersonJAP?

1 个答案:

答案 0 :(得分:0)

您是否要为给定的人员ID检索PersonJPA对象,以便还加载其关联的AddressJPA集合集合?在这种情况下,您需要一个FETCH JOIN。

在Criteria API中:

EntityManager em = entityManagerFactory.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<PersonJPA> query = cb .createQuery(PersonJPA.class);
Root<PersonJPA> person = query.from(PersonJPA.class);
query.fetch("address");
query.select(person);
ParameterExpression<Long> p = cb.parameter(Long.class);
query.where(cb.equal(cb.get("personId"), p));

在JP QL中:

SELECT p FROM PersonJPA p JOIN FETCH p.address
WHERE p.personId = :p

或者,您可能希望在注释中指定获取模式(EAGER)(因为默认情况下关联的集合是延迟加载的):

@OneToMany(mappedBy = "personId",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Set<AddressJPA> address;

@Fetch注释是特定于Hibernate的,而不是来自JPA。它指定了如何获取数据的策略。 查看更多信息here