首页 > 解决方案 > Spring data JPA with SQL Server - lower() 函数导致全表扫描

问题描述

在一个简单的 SpringBoot (2.0.5) + JPA + SQL Server 微服务中,通过JpaRepository实现实现持久性(没有其他方法),我们看到 transact-sqllower()函数被注入到生成的 SQL 包装查询列中,其中turn 会导致全表扫描,因此会影响原本简单、快速的索引支持查询的性能。

显然这是为了使查询不区分大小写,但是由于 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 是否会产生影响——我将尝试暂时删除它(尽管它是必需的)。

标签: javasql-serverhibernatespring-data-jpaquerydsl

解决方案


在仔细检查 QueryDsl 谓词时,这很简单(并且是自己造成的) - 将equalsIgnoreCase()谓词中的使用更改为eq()并解决了问题。因此,配置或库中没有问题,但需要注意。


推荐阅读