【问题标题】:Hibernate FetchMode = Join doesn't work休眠 FetchMode = 加入不起作用
【发布时间】:2015-12-28 17:12:21
【问题描述】:

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

【问题讨论】:

    标签: hibernate jpa join criteria-api


    【解决方案1】:

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

    在标准 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2015-10-28
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多