Spring 数据 JPQL 查询:List 参数小写

Spring Data JPQL query: lower case for List param

我在我的项目中使用 Spring Data REST 并且我有一个 @Query 标记,例如:

@Query("from Customer c where lower(c.customerId) = lower(:customerId) and lower(c.department.businessUnit.name) = lower(:businessUnit)") 
List<Customer> findByCustomerIdAndBusinessUnit(@Param('customerId') String customerId, @Param('businessUnit') String businessUnit)

这很好用。但是,我不确定传入List时如何转换为小写,例如:

@Query("SELECT c FROM Customer c WHERE LOWER(c.customerId) IN LOWER(:customerIds)")
Page<Customer> findByCustomerIdIn(@Param("customerIds") List<String> customerIds, Pageable pageable)

这给了我以下错误:

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 94 [SELECT c FROM com.myapp.Customer c WHERE LOWER(c.customerId) IN LOWER(:customerIds)]

我理解这是因为 Spring Data REST 无法将整个字符串列表转换为小写(这在直接的 TSQL / PLSQL 中也是不可能的!)。那么,我的选择是否仅限于实现我自己的存储库并在其之上构建一个控制器......?有更好的主意吗? :)

我相信,你必须转换列表。

即使您打算像

一样使用 Spring JPA findByQuery
List<User> findByCustomerIdInIgnoreCase(List<String> customerIds);

您必须编写一些代码将列表转换为小写字符串列表。

如果您正在寻找就地转换列表,这可能是不可能的,因为 Java 中的字符串是不可变的

但是,如果打算在一行中完成,请使用尽可能少的代码。

您可以在 Java 8 中完成,如下所示。

List<String> customerIdsLC = customerIds.stream().map(String::toLowerCase).collect(Collectors.toList());

以防万一,您需要进行不同的转换 - 只需以 Class::method

的形式向 map() 提供正确的信息

例如

map(String::toUpperCase) - 转换为大写

map(Long::valueOf) - 转换为 Long。