带有原生查询的@ManyToOne导致N + 1选择

时间:2017-08-19 07:51:09

标签: mysql hibernate spring-boot spring-data-jpa

我知道N + 1选择的问题是众所周知的,但是当我使用本机查询时,尝试使用不同的提取策略并没有帮助避免它。

我有2个实体:A和B对应于mysql表A和B. 表A中的几行可以具有相同的b_id,这就是我使用@ManyToOne注释的原因。

@Entity
@Table(name = "A")
public class A {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;

  private String name;

  @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  @Fetch(FetchMode.JOIN)
  private B b;
}

我也创建了实体B.

@Entity
@Table(name = "B")
public class B {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;

  private String url;
}

我需要找到A中所有只链接到表B中的1行的行。所以我在我的ARepository中创建了本机查询

public interface ARepository extends JpaRepository<A, Integer> {
 @Query(value = "SELECT a.id, a.b_id, a.name, b.url "
          + "FROM a "
          + "JOIN b ON a.b_id = b.id "
          + "GROUP BY a.b_id "
          + "HAVING count(a.b_id) = 1, nativeQuery = true)
  List<A> getLinkedOnce();

但是,当我运行我刚刚从存储库中调用getLinkedOnce方法的restcontroller时,我看到在控制台中,我的查询被调用了1-st,然后A中每行的选择数都以

from B b0_ where b0_.id=?

我尝试使用不同的方法,LAZY,EAGER,它不起作用。我认为因为有一个原生查询的用法。但也许原因是另一个原因。

0 个答案:

没有答案