我看到即使使用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?
答案 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。