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
相关产品推荐
相关产品推荐

