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

SpringBoot中Native Query的Like操作符格式问题

解决原生查询中LIKE操作符的参数绑定错误

嘿,我来帮你搞定这个问题!你遇到的IllegalArgumentException: Unknown parameter name : country错误,根源是原生查询里的参数写法不对,JPA没法正确识别你的:country参数。

错误原因分析

你原来的查询语句是:

@Query(value = "SELECT max(id) FROM EMP where id like ___:country%", nativeQuery=true)

这里的问题在于,JPA会把:country%当成一个完整的参数名(而不是:country加上%),但你的方法参数是country,所以它找不到名为country%的参数,自然就报错了。另外,直接把%跟在参数名后面的写法在原生SQL查询里是不被支持的,得换一种方式拼接字符串。

正确的解决方案

这里给你三种常用的正确写法:

方案1:用SQL的CONCAT函数拼接字符串

在原生查询里,用CONCAT把固定前缀(三个下划线)、参数和%拼接起来,这样JPA能正确识别参数:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

// ...

@Query(value = "SELECT max(id) FROM EMP where id like CONCAT('___', :country, '%')", nativeQuery = true)
Long findMaxEmpId(@Param("country") String country);
  • @Param("country")用来绑定方法参数和查询里的:country参数,确保名称对应上。
  • CONCAT('___', :country, '%')会生成___[country值]%的匹配字符串,完全符合你原来的需求。

方案2:在Java代码里拼接%

如果你不想在SQL里用CONCAT,也可以把拼接逻辑放到Java代码中,查询语句只负责接收完整的匹配字符串:

@Query(value = "SELECT max(id) FROM EMP where id like :countryPattern", nativeQuery = true)
Long findMaxEmpId(@Param("countryPattern") String countryPattern);

调用方法时传入拼接好的字符串:

// 比如country是"CN",就传入"___CN%"
long maxId = empRepository.findMaxEmpId("___" + country + "%");

方案3:用位置参数(简洁版)

如果你不想用@Param标注命名参数,也可以用位置参数?1来绑定方法的第一个参数:

@Query(value = "SELECT max(id) FROM EMP where id like CONCAT('___', ?1, '%')", nativeQuery = true)
Long findMaxEmpId(String country);

这种写法更简洁,适合参数数量少的场景。

额外提醒

如果是JPQL查询(非原生),可以直接写like %:country%,但原生SQL不支持这种语法,必须用CONCAT或者代码拼接的方式,这一点要注意区分哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:37