【问题标题】:How can I ignore case sensitivity in the query in JPA?如何在 JPA 的查询中忽略区分大小写?
【发布时间】:2021-12-09 00:29:39
【问题描述】:

我有一个小问题。我有以下查询,应该按 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);

也不行

【问题讨论】:

标签: postgresql jpa


【解决方案1】:

尝试使用ILIKE 而不是LIKE,应该可以,请参阅文档here

可以使用关键字 ILIKE 代替 LIKE 进行匹配 根据活动区域设置不区分大小写。这不在 SQL 标准,但它是 PostgreSQL 扩展。

【讨论】:

  • 感谢您的回答,但 JPA 似乎不接受 ILIKE。
【解决方案2】:

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,'%') )"

【讨论】:

  • 抱歉回复晚了。但这对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多