В простом микросервисе SpringBoot (2.0.5) + JPA + SQL Server с сохранением через реализацию JpaRepository
(без дополнительных методов) мы видим, как функция transact-sql lower()
внедряется в сгенерированную оболочку SQLзапрошенный столбец (столбцы), который, в свою очередь, вызывает полное сканирование таблицы и, следовательно, влияет на производительность того, что в противном случае было бы простым и быстрым запросом с поддержкой индекса.
Очевидно, что это нужно сделатьзапросы нечувствительны к регистру, однако, поскольку SQL Server по умолчанию нечувствителен к регистру, нет необходимости вводить эту функцию.Из документов JPA Spring Data видно, что суффиксы методов репозитория с IgnoreCase
должны делать запросы нечувствительными к регистру для тех БД, которые по умолчанию чувствительны к регистру, однако я не вижу, как настроить его так, чтобы он учитывал входящий регистр.
JPA config:
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 может оказать влияние - я постараюсь временно удалить это (хотя это необходимо).