JPA findBy ... IgnoreCase и PostgreSQL индексация - PullRequest
0 голосов
/ 05 июля 2018

У меня следующий вопрос о findByUsernameIgnoreCase поиске и индексации. Например, у меня есть столбец БД username (уникальный индекс) в таблице users, и я хочу поиск без учета регистра. На данный момент все записи в верхнем регистре.

Вопрос в том, findByUsernameIgnoreCase(...) будет использовать индексирование или нет?

В спецификации результат IgnoreCase равен where UPPER(username)=UPPER(?1), что смущает меня в порядке индекса.

1 Ответ

0 голосов
/ 05 июля 2018

Для метода 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...