我知道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,它不起作用。我认为因为有一个原生查询的用法。但也许原因是另一个原因。