首页 > 解决方案 > JPA findBy...IgnoreCase 和 PostgreSQL 索引

问题描述

我有以下关于findByUsernameIgnoreCase查找和索引的问题。例如,我username在表中有 DB 列(唯一索引)users,我想要不区分大小写的查找。现在所有的记录都是大写的。

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

在规范中,IgnoreCase 的结果where UPPER(username)=UPPER(?1)让我在索引顺序上感到困惑。

标签: springpostgresqlspring-data-jpa

解决方案


对于findBy...IgnoreCase("someName")Spring Data JPA 方法,生成类似这样的 SQL:

select ... from users u where upper(u.username) = upper('someName')

因此,如果将它与索引一起使用,您应该创建一个“上(用户名)”索引,如下所示:

create index index_users_username_upper on users (upper(username));

查询计划示例:

父母 p 上的位图堆扫描(成本=83.17..8791.50 行=5000 宽度=346)(实际时间=0.024..0.024 行=0 循环=1)
  过滤器:(上(用户名)~~'SOMENAME'::text)
  -> index_users_username_upper 上的位图索引扫描(成本=0.00..81.92 行=5000 宽度=0)(实际时间=0.022..0.022 行=0 循环=1)
        索引条件: (upper(name) = 'SOMENAME'::text)
规划时间:0.207 ms
执行时间:0.051 ms

我认为username在这种情况下不一定要以大写形式存储...


您始终可以创建符合您的条件的自己的查询方法,例如:

@Query("select u from User u where upper(u.username) = ?1")
List<User> findByUsernameIgnoreCase(string name);

在这种情况下,您可以使用简单索引 by username


推荐阅读