Spring数据JPA原生查询N+1问题
Spring Data JPA Native Query N + 1 problem
我已经 运行 进入了一些我不清楚其行为的代码。
我们有第一个实体:
@Data
@Entity
@Table(name = "Info")
public class Info {
@OneToOne
@JoinColumn(name = "data_id")
private Data data;
}
第二个:
@Data
@Entity
@Table(name = "Data")
public class Data {
@Id
private Long dataId
}
我们还有下一个检索数据的方法:
@Query(value = "SELECT * FROM Info i inner join Data d on d.data_id=i.data_id",
nativeQuery = true)
List<Info> getInfo() {}
由于 nativeQuery = true 存在,我希望此方法只生成一个 SQL select 并检索我的数据。但是如果我看一下日志实际上有 2 selects:
SELECT * FROM Info i inner join Data d on d.data_id=i.data_id;
SELECT * FROM Data d where d.data_id = 123;
为什么会这样?如何修复它以仅制作一个 select 并检索所有数据?
如果没有 Hibernate specific APIs,则无法指定本机查询提取。我建议您使用普通的 JPQL/HQL 查询:
@Query(value = "FROM Info i join fetch i.data")
List<Info> getInfo();
这将执行与您的本机查询相同的操作,但同时 运行 只有一个查询。
我已经 运行 进入了一些我不清楚其行为的代码。
我们有第一个实体:
@Data
@Entity
@Table(name = "Info")
public class Info {
@OneToOne
@JoinColumn(name = "data_id")
private Data data;
}
第二个:
@Data
@Entity
@Table(name = "Data")
public class Data {
@Id
private Long dataId
}
我们还有下一个检索数据的方法:
@Query(value = "SELECT * FROM Info i inner join Data d on d.data_id=i.data_id",
nativeQuery = true)
List<Info> getInfo() {}
由于 nativeQuery = true 存在,我希望此方法只生成一个 SQL select 并检索我的数据。但是如果我看一下日志实际上有 2 selects:
SELECT * FROM Info i inner join Data d on d.data_id=i.data_id;
SELECT * FROM Data d where d.data_id = 123;
为什么会这样?如何修复它以仅制作一个 select 并检索所有数据?
如果没有 Hibernate specific APIs,则无法指定本机查询提取。我建议您使用普通的 JPQL/HQL 查询:
@Query(value = "FROM Info i join fetch i.data")
List<Info> getInfo();
这将执行与您的本机查询相同的操作,但同时 运行 只有一个查询。