OneTONE关系上的Hibernate N+1问题

OneTONE关系上的Hibernate N+1问题,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我将SpringDataJPA与hibernate一起用于ORM的SpringBoot应用程序。我对OneTONE关系生成N+1查询有一个问题,而我不需要获取OneTONE对象 我的OneToOne关系被急切地获取,我尝试使用lazy with fetch模式加入,但仍然无法让它只生成一个查询 以下是实体和查询的代码: @Entity @Table(name = "item") public class Item implements Serializable { @Id @Gen

我将SpringDataJPA与hibernate一起用于ORM的SpringBoot应用程序。我对OneTONE关系生成N+1查询有一个问题,而我不需要获取OneTONE对象

我的OneToOne关系被急切地获取,我尝试使用lazy with fetch模式加入,但仍然无法让它只生成一个查询

以下是实体和查询的代码:

@Entity
@Table(name = "item")
public class Item implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
   @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

   @Column(name = "number")
   private String number;

   @Column(name = "date")
   private LocalDate date;

    @OneToOne(mappedBy = "item", fetch = FetchType.EAGER)
    @JsonIgnore
    private Status status;

}

@Entity
@Table(name = "status")
public class Status implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
   @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

   @OneToOne(fetch = FetchType.EAGER)
   @JoinColumn(unique = true)
   private Item item;

}
以下是存储库中的查询:

@Query(value = "SELECT * FROM ( SELECT  number, MAX(date) AS date FROM item WHERE date < ? GROUP BY number) AS latest_it INNER JOIN item ON item.number = latest_it.number AND item.date = latest_it.date", nativeQuery = true)
List<Item> findLatestByNumberAndDate(LocalDate localDate);
然而,我期望看到的是,只执行存储库中定义的查询。这个问题对性能来说是一个真正的难题

你有什么暗示吗


谢谢

通过执行本机查询,您不需要使用Hibernate Fetch配置

您可以在状态上执行JPQL,以获取查询中的状态并避免其他查询:

@查询值= 选择*,MAXdate 来自项目一 左连接获取i.status 按编号分组 我有约会吗? 列出findLatestByNumberAndDateLocalDate localDate;
否则,请看这篇文章,它将向您展示使OneToOne懒惰的各种可能性:

不确定,但@fetchmode.JOIN应该对您有所帮助。我在status属性上尝试了它,但它不起作用。
select status0_.id ... from status status0_ left outer join item item1_ on status0_.item_id=item1_.id left outer join status status2_ on item1_.id=status2_.item_id where status0_.item_id=?