spring - JPA findBy...IgnoreCase 和 PostgreSQL 索引
问题描述
我有以下关于findByUsernameIgnoreCase
查找和索引的问题。例如,我username
在表中有 DB 列(唯一索引)users
,我想要不区分大小写的查找。现在所有的记录都是大写的。
问题是是否findByUsernameIgnoreCase(...)
会使用索引?
在规范中,IgnoreCase 的结果where UPPER(username)=UPPER(?1)
让我在索引顺序上感到困惑。
解决方案
对于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
。
推荐阅读
- javascript - How to get the access to the id from my element?
- vb.net - FileIO.TextFieldParser 获取未更改的行以报告解析失败
- sql-server - Licensing for SSRS/SQL Server for making SSRS Reports available to public non AD users through ASP.NET Website
- excel - 导入的工作表随机插入第一张而不是最后一张
- javascript - 行首的分号有什么作用?
- bluetooth - 如何删除HC-05蓝牙模块的密码?
- scala - 如何使用 Apache Spark 中的列子集减去 DataFrame
- pyspark - 如何在pyspark中聚合连续的行
- html - 使用锚标签创建的按钮上的悬停效果不正确
- c++ - MATLAB R2016b - MEX 无法编译 C++ 代码