JPA findBy ... IgnoreCase和PostgreSQL索引

时间:2018-07-05 14:53:01

标签: spring postgresql spring-data-jpa

我对findByUsernameIgnoreCase查找和索引有以下疑问。 例如,我在username表中有DB列users(唯一索引),并且我希望区分大小写。 目前,所有记录都以大写字母表示。

问题是findByUsernameIgnoreCase(...)是否使用索引?

按照规范,IgnoreCase的结果为where UPPER(username)=UPPER(?1),这使我对索引的顺序感到困惑。

1 个答案:

答案 0 :(得分:1)

对于方法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)
        Index Cond: (upper(name) = 'SOMENAME'::text)
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使用简单索引。