Для метода findBy...IgnoreCase("someName")
Spring Data JPA генерирует подобный SQL:
select ... from users u where upper(u.username) = upper('someName')
Так что в случае использования его с индексом вы должны создать индекс 'upper (username)', например:
create index index_users_username_upper on users (upper(username));
Пример плана запроса:
Bitmap Heap Scan on parents p (cost=83.17..8791.50 rows=5000 width=346) (actual time=0.024..0.024 rows=0 loops=1)
Filter: (upper(username) ~~ 'SOMENAME'::text)
-> Bitmap Index Scan on index_users_username_upper (cost=0.00..81.92 rows=5000 width=0) (actual time=0.022..0.022 rows=0 loops=1)
<b>Index Cond: (upper(name) = 'SOMENAME'::text)</b>
Planning time: 0.207 ms
Execution time: 0.051 ms
Я думаю, что хранение username
в верхнем регистре не обязательно в этом случае ...
Вы всегда можете создать свой собственный метод запроса, который будет соответствовать вашим условиям, например:
@Query("select u from User u where upper(u.username) = ?1")
List<User> findByUsernameIgnoreCase(string name);
В этом случае вы можете использовать простой индекс по username
.