【问题标题】:Does Spring Data JPA projection optimize the sql?Spring Data JPA 投影是否优化了 sql?
【发布时间】:2018-03-08 05:43:20
【问题描述】:

春季启动:1.5.10 春季数据 JPA:1.11.10

IE 我的实体

 class MyEntity{
     private Long id;
     private String name;
     private Integer age;
    // getter setter
 }

我的投影

 interface MyProjection{ String getName() }

MyEntityRepository

 ...
  MyProjection findById(Long Id)
  ...

当我调用 findById 函数时,生成的 sql 是:

 select myentity0_.id, myentity0_.name,myentity0_.age from MyEntity myentity0_ where ...

为什么还要选择年龄列?

【问题讨论】:

  • 这看起来很奇怪,我只是在两个不同的项目中做了一个快速测试,一个旧的 Spring-Data 1.5.1 + Hibernate 和一个新的 Spring-Data 1.11.9 + EclipseLink,在这两种情况下只有选择了投影界面中的列。
  • @KlausGroenbaek 我使用 javax.persistence.* 而不是 EclipseLink。你使用 Spring Data JPA 吗?
  • JPA 是一个规范,有很多实现,Spring Boot 的默认 JPA 提供程序是 Hibernate(通常替换为 EclipseLink)。我的测试使用了两个不同的 JPA 提供程序,两个不同版本的 Spring Boot/Data,并且在这两种情况下都只选择了投影中的列。如果你可以在 GitHub 上的独立项目中重现它,我可以看看它。

标签: spring spring-data-jpa


【解决方案1】:

是的,Spring Data JPA 在处理界面投影时应该只选择它需要的特定列。

我刚刚根据您的问题在一个简单的项目中对其进行了测试,并观察到正在执行以下查询:

select myentity0_.name as col_0_0_ from my_entity myentity0_ where myentity0_.id=?

这表明您的应用程序的行为有所不同。查看示例项目并将其与您自己的项目进行比较,看看您是否能发现任何差异:https://github.com/roberthunt/spring-data-interface-projection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2018-09-23
    相关资源
    最近更新 更多