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

Spring Boot中含':'的JPQL查询编写异常求助

解决JPQL参数识别错误的问题

这个报错的核心原因是你JPQL语句里的转义写法干扰了JPA对参数占位符的识别。咱们一步步来解决:

方案1:在Java代码层拼接匹配模式(推荐)

把通配符和参数的拼接逻辑从JPQL里移出来,让JPQL只负责接收完整的匹配字符串,这样能彻底避免转义冲突:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;

// 仓库接口中的方法
@Query("SELECT logs FROM Logs logs WHERE logs.featureId LIKE :pattern")
public List<Logs> getLogsByStationId(@Param("pattern") String pattern);

调用这个方法的时候,提前拼接好匹配字符串:

// 假设data是传入的Integer参数
String matchPattern = String.format("%%|data:%d%%", data);
List<Logs> result = logRepository.getLogsByStationId(matchPattern);

这里用%%是因为Java字符串里%本身需要转义成%%才能被String.format正确解析。

方案2:用JPQL的CONCAT函数拼接字符串

如果希望匹配逻辑留在JPQL里,可以用JPA支持的CONCAT函数来拼接固定字符串和参数,这样不用处理冒号的转义:

@Query("SELECT logs FROM Logs logs WHERE logs.featureId LIKE CONCAT('%|data:', :data, '%')")
public List<Logs> getLogsByStationId(@Param("data") Integer data);

这种写法里,:data会被JPA正确识别为参数,'%|data:'和'%'是固定字符串字面量,通过CONCAT组合成完整的匹配模式。

为什么你的原写法会报错?

你原JPQL里的'%|data\\: :data%'存在两个问题:

  1. Java字符串中的\\:会被转义成单个:,传到JPA后变成'%|data: :data%',这里的两个冒号让JPA无法正确识别:data这个参数占位符。
  2. JPQL中表示字面量冒号不需要用反斜杠转义,只要把字符串用单引号包裹即可,但你这里的写法把参数占位符和字面量冒号混在一起,导致参数解析失败。

内容的提问来源于stack exchange,提问作者iftekhar iftekhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:00:10