JPA查询中%运算符对存储数字的字符串类型字段失效是什么原因?
问题核心原因
你遇到的问题不是%运算符对数字字符串不生效,而是JPQL语句中externalId对应的模糊查询语法存在错误。
原查询中两个字段的模糊查询逻辑写法不统一:
carportName的查询逻辑正确使用了concat('%',:filterCriteria,'%')完成通配符和查询参数的拼接,所以模糊匹配功能正常externalId的查询逻辑直接写了LIKE %:filterCriteria%,JPQL不支持这种直接在参数两侧加通配符的写法,实际执行时该逻辑会退化为完全匹配,所以只有传入完整的externalId值才能命中结果,传入片段时无匹配数据。
修复方案
把externalId对应的模糊查询逻辑也改为用concat拼接通配符即可,修正后的代码如下:
@Query("SELECT d FROM CarportLocationEntityView d WHERE d.externalId LIKE concat('%',:filterCriteria,'%') OR lower(d.carportName) LIKE lower(concat('%',:filterCriteria,'%')) ") List<CarportLocationEntityView> filterCarportList(@Param("filterCriteria") String filterCriteria);
如果业务场景需要兼容externalId可能存在的大小写差异(当前你明确该字段均为数字格式字符串,无大小写区分需求可忽略),也可以和carportName一样加上lower函数统一大小写匹配逻辑。
内容的提问来源于stack exchange,提问作者Doncarlito87
相关产品推荐
相关产品推荐

