在一个简单的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的额外使用是否会产生影响-我将尝试暂时删除它(尽管有必要)。
答案 0 :(得分:0)
在仔细检查QueryDsl谓词时,这是直接的(并且是自我造成的)-将谓词中的equalsIgnoreCase()
的使用更改为eq()
,从而解决了该问题。因此,配置或库中没有问题,只有一个需要注意。