首页 > 解决方案 > 如何在 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);

也不起作用

标签: postgresqljpa

解决方案


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

推荐阅读