You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:25:27