postgresql - 如何在 JPA 的查询中忽略区分大小写?
问题描述
我有一个小问题。我有以下查询,应该按 externalId 或 carName 过滤。该查询也有效,但查询区分大小写。但是过滤器应该忽略大小写。
@Query("SELECT d FROM CarLocationEntityView d WHERE d.externalId LIKE %:carNameAndExternalId% OR d.carName LIKE %:carNameAndExternalId% ")
List<CarLocationEntityView> findByCarNameAndExternalId(String carNameAndExternalId);
我正在使用 JPA 和 Postgres Sql 数据库。
第一次尝试:
@Query("SELECT d FROM CarLocationEntityView d WHERE d.externalId LIKE %:carNameAndExternalId% OR d.carName LIKE '%:carNameAndExternalId% COLLATE latin1_general_cs' ")
List<CarLocationEntityView> findByCarNameAndExternalId(String carNameAndExternalId);
不工作
第二次尝试:
@Query("SELECT d FROM CarLocationEntityView d WHERE d.externalId LIKE %:carNameAndExternalId% OR d.carName LIKE low(%:carNameAndExternalId% )")
List<CarLocationEntityView> findByCarNameAndExternalId(String carNameAndExternalId);
也不起作用
第三次尝试:
@Query("SELECT d FROM CarLocationEntityView d WHERE d.externalId LIKE %:carNameAndExternalId% OR d.carName ILIKE %:carNameAndExternalId% ")
List<CarLocationEntityView> findByCarNameAndExternalId(String carNameAndExternalId);
也不起作用
解决方案
JPQL 2.1 添加了 FUNCTION 来调用特定于 DB 的操作,但 ILIKE 在其中不起作用。有一些 JPA 提供程序特定的选项,但通常我看到项目只是在字符串上使用 lower,类似于您的第二次尝试,但在两个字符串上都用于不区分大小写的比较。就像是:
"SELECT d FROM CarLocationEntityView d WHERE d.externalId LIKE %:carNameAndExternalId% OR lower(d.carName) LIKE lower(concat('%', :carNameAndExternalId,'%') )"
推荐阅读
- r - 试图通过分位数获取 Diamonds 数据集的计数
- google-sheets - 切换日期和月份谷歌表
- python - scanpy 邻居函数:LLVM 错误:找不到符号:__svml_sqrtf8
- java - 如何从xml读取值并将其存储在java中的哈希映射中
- laravel - Laravel 数字验证 gte:5 也允许 0
- javascript - 幻灯片不接受属性中指定的宽度
- java - 是否最好为 Mockito 中的每个“何时”调用进行“验证”调用?
- javascript - 如何使表单元素填充表格行并启用表格的编辑、删除和更新按钮
- javascript - 从 vanilla JS 中的两个对象数组创建一个新的对象数组
- jboss7.x - 尝试从 Codeready Studio 12.19.1 停止 JBoss EAP 7.3 时出错