簡體   English   中英

帶有SQL Server的Spring數據JPA-Lower()函數導致全表掃描

[英]Spring data JPA with SQL Server - lower() function causes full table scan

在一個簡單的SpringBoot(2.0.5)+ JPA + SQL Server微服務中,它通過JpaRepository實現進行持久化(沒有其他方法),我們看到transact-sql lower()函數被注入到生成的SQL中,該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的額外使用是否會產生影響-我將嘗試暫時刪除它(盡管這是必需的)。

在仔細檢查QueryDsl謂詞時,這是直接的(並且是自我造成的)-將謂詞中equalsIgnoreCase()的使用更改為eq() ,從而解決了該問題。 因此,配置或庫中沒有問題,只有一個需要注意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM