java - Spring Data JPA Native Query N+1问题

标签 java sql spring hibernate spring-data-jpa

我遇到了一些代码,其行为我不清楚。

我们有第一个实体:

@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 选择并检索数据。但如果我看一下日志,实际上有 2 个选择:

SELECT * FROM Info i inner join Data d on d.data_id=i.data_id;

SELECT * FROM Data d where d.data_id = 123;

为什么会发生这种情况?如何修复它以仅进行一项选择并检索所有数据?

最佳答案

如果没有 Hibernate specific APIs 则无法指定 native 查询提取。我建议您使用普通的 JPQL/HQL 查询:

@Query(value = "FROM Info i join fetch i.data")
List<Info> getInfo();

这将与您的 native 查询执行相同的操作,但同时仅运行单个查询。

关于java - Spring Data JPA Native Query N+1问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69131690/

相关文章:

java - PrimeFaces 数据表编辑与 pojo 中的自动完成功能

sql - 随时间查询 DAU/MAU(每天)

mysql - 将两行合二为一 - Mysql

javascript - 如何在 JavaScript 中使用 C# SQLDataReader 对象

java - Spring上下文配置文件问题

java - OpenGL : performance in C++ (NDK) vs Java (Dalvik) 中的 Android 专用游戏

java - ButtonGroup空指针异常

java - 从 Spring Integration 启动 Spring Batch 作业

java - 记录插入数据库后如何从数据库获取ID

java - Spring JPA : Should the Save() method commit data to the database?