java - 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 是否会产生影响——我将尝试暂时删除它(尽管它是必需的)。
解决方案
在仔细检查 QueryDsl 谓词时,这很简单(并且是自己造成的) - 将equalsIgnoreCase()
谓词中的使用更改为eq()
并解决了问题。因此,配置或库中没有问题,但需要注意。
推荐阅读
- c# - 将 XML 多个节点放入具有 2 列的 dataGridView
- python - 将 tf.contrib.layers.xavier_initializer() 更改为 2.0.0
- ios - 使用 HERO 转换更改根视图控制器
- excel - Excel 如何知道文件“在上次保存之前没有重新计算”。我可以欺骗 Excel 以相反的方式思考吗?
- c++ - (UE4 C++) 将数据表行名转换为类名以生成actors
- mysql - 我将如何使用 MySQL 修复此表?
- json - 如何唯一标识一个json字符串?
- c# - 将 json 转换为自定义 json 格式 C#
- azure - 使用 Azure Devops 备份 Azure SQL 数据库
- mysql - MySQL 工作场所查询