如何在HQL中对字符串列表的所有元素执行正则替换?
问题:HQL中能否直接移除入参列表
codes的所有连字符? 我有如下查询语句:
@Query("SELECT t FROM thing t WHERE t.code in :codes") public List<Thing> getThingsByCodeList(@Param("codes") List<String> codes);
现在需要在查询中忽略连字符,因此我将t.code中的连字符全部移除,修改后的查询如下:
@Query("SELECT t FROM thing t WHERE regexp_replace(t.code, '-', '') in :codes") public List<Thing> getThingsByCodeList(@Param("codes") List<String> codes);
但我不确定如何同时移除入参列表codes中所有字符串的连字符。我知道可以在调用该方法前移除连字符,但想先确认是否无法在HQL中实现此操作。
解答
HQL本身不支持直接对入参列表的每个元素执行字符串替换操作,没办法在HQL语句里一次性处理codes列表中所有元素的连字符。
原因在于:HQL的in子句只能直接匹配传入的集合元素,没有内置语法可以遍历集合并对每个元素做函数转换。虽然HQL支持调用部分数据库函数(比如regexp_replace),但这些函数仅能作用于实体的字段,无法直接作用于传入的参数集合。
所以最直接可行的方案还是你提到的:在调用getThingsByCodeList方法之前,先在业务代码里处理codes列表,移除每个字符串的连字符后再传入方法。示例代码如下:
// 调用前处理入参,移除所有连字符 List<String> processedCodes = codes.stream() .map(code -> code.replace("-", "")) .collect(Collectors.toList()); // 调用查询方法 List<Thing> things = thingRepository.getThingsByCodeList(processedCodes);
如果你的项目使用Spring Data JPA 2.1+,也可以尝试结合SpEL表达式实现,但这种方式不如提前处理入参直观,还可能增加代码复杂度,不推荐作为首选方案。
内容的提问来源于stack exchange,提问作者Daniel Burgess
相关产品推荐
相关产品推荐

