【发布时间】:2019-04-16 06:31:54
【问题描述】:
在一个简单的 SpringBoot (2.0.5) + JPA + SQL Server 微服务中,通过 JpaRepository 实现(没有其他方法)持久化,我们看到 transact-sql lower() 函数被注入到生成的 SQL 包装中查询的列,这反过来会导致全表扫描,从而影响原本简单、快速的索引支持查询的性能。
显然这是为了使查询不区分大小写,但是由于 SQL Server 默认情况下不区分大小写,因此无需注入此函数。我可以从 Spring Data JPA 文档中看到,使用 IgnoreCase 后缀的存储库方法应该使查询对默认情况下区分大小写的 DB 不区分大小写,但是我看不到如何配置它以尊重传入的大小写。
JPA 配置:
jpa:
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
dialect: org.hibernate.dialect.SQLServer2012Dialect
ddl-auto: validate
存储库接口:
@Repository
public interface MyRepo extends JpaRepository<Thing, Long>, QuerydslPredicateExecutor<Thing> {}
我尝试从配置中删除 SQLServer2012Dialect - 没有区别。我不确定额外使用 QueryDSL 是否会产生影响 - 我将尝试暂时删除它(尽管它是必需的)。
【问题讨论】:
-
您在 MyRepo 上调用哪种方法?我还要说 Querydsl 是问题所在。我从来没有见过 hibernate 在不告诉你的情况下添加任何较低或较高的功能
-
我想你可能是对的,我打算今天下午删除它。这是我正在调用的方法(确实来自
QuerydslPredicateExecutor:Page<T> findAll(Predicate predicate, Pageable pageable); -
预测结果如何?
-
就是这样 - 查看答案 ;-)
标签: java sql-server hibernate spring-data-jpa querydsl