【问题标题】:Spring data JPA with SQL Server - lower() function causes full table scanSpring data JPA with SQL Server - lower() 函数导致全表扫描
【发布时间】: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&lt;T&gt; findAll(Predicate predicate, Pageable pageable);
  • 预测结果如何?
  • 就是这样 - 查看答案 ;-)

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2014-11-27
    • 2019-05-28
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多