带有SQL Server的Spring数据JPA-Lower()函数导致全表扫描

时间:2018-11-13 12:11:43

标签: java sql-server hibernate spring-data-jpa querydsl

在一个简单的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的额外使用是否会产生影响-我将尝试暂时删除它(尽管有必要)。

1 个答案:

答案 0 :(得分:0)

在仔细检查QueryDsl谓词时,这是直接的(并且是自我造成的)-将谓词中的equalsIgnoreCase()的使用更改为eq(),从而解决了该问题。因此,配置或库中没有问题,只有一个需要注意。