为什么以下第二个native query原生查询无法正常返回正确结果?
问题排查与解决方案
错误原因
- 原生SQL中你将参数占位符
:query放在了两个单引号中间,Spring Data JPA会将单引号内的内容识别为普通字符串,无法把:query和你传入的参数绑定,最终执行的SQL里:query不会被替换成实际的查询值。 - 通配符
%和参数的拼接逻辑错误,你当前的写法最终生成的SQL片段为like '%' '实际参数' '%',不符合SQL语法规范,要么执行报错要么匹配不到任何数据。
正确写法
推荐使用CONCAT函数直接在SQL层面拼接通配符和参数,无需额外处理业务层入参:
@Query(nativeQuery = true, value = "select * from meeting as m where m.meeting_name like CONCAT('%', :query, '%')") List<Meeting> findByNativeQuery(@Param("query") String query);
也可以选择在业务层调用方法时,先给入参query前后拼接%,SQL直接写参数绑定即可:
// DAO层写法 @Query(nativeQuery = true, value = "select * from meeting as m where m.meeting_name like :query") List<Meeting> findByNativeQuery(@Param("query") String query); // 业务层调用示例 String searchParam = "%" + query + "%"; meetingRepository.findByNativeQuery(searchParam);
补充说明
JPQL本身支持%:query%这种直接的参数绑定写法,框架会自动处理通配符和参数的拼接逻辑,但原生SQL没有做这类语法兼容,必须遵循标准SQL的参数绑定和字符串拼接规则。
内容的提问来源于stack exchange,提问作者Siful Islam Ove
相关产品推荐
相关产品推荐

