如何让Java Repository传递的keyword参数被PSQL识别为变量
问题根因
你的写法存在两个问题导致参数无法被识别:
- SQL中被单引号包裹的
%keyword%会被PostgreSQL直接识别为固定字符串常量,不会和@Param绑定的入参做关联 - Spring Data JPA原生查询中,需要用
:参数名格式标记参数占位符,你没有给keyword添加:前缀,框架也无法识别这是需要绑定的参数
可行修改方案
方案1:使用SQL字符串拼接函数拼接通配符(无需修改上层调用逻辑,推荐)
直接修改Repository中的查询语句,用concat函数拼接通配符和参数占位符即可:
package com.rev.booktags_sts.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.rev.booktags_sts.model.Booktags; import java.util.List; @Repository public interface BooktagsRepository extends JpaRepository<Booktags, Long>{ //Custom query @Query(value = "SELECT * FROM booktags s where s.tagname like concat('%', :keyword, '%')", nativeQuery = true) List<Booktags> findByKeyword(@Param("keyword") String keyword); }
方案2:使用PostgreSQL原生字符串拼接符
和方案1逻辑一致,改用PostgreSQL支持的||字符串拼接符实现,效果完全相同:
@Query(value = "SELECT * FROM booktags s where s.tagname like '%' || :keyword || '%'", nativeQuery = true) List<Booktags> findByKeyword(@Param("keyword") String keyword);
方案3:在上层业务代码中拼接通配符
如果不想改动SQL语句,可以在调用findByKeyword方法时提前给入参拼接通配符:
// 业务层调用示例 String searchInput = "用户输入的搜索关键词"; List<Booktags> result = booktagsRepository.findByKeyword("%" + searchInput + "%");
对应Repository的SQL直接写参数占位符即可:
@Query(value = "SELECT * FROM booktags s where s.tagname like :keyword", nativeQuery = true) List<Booktags> findByKeyword(@Param("keyword") String keyword);
内容的提问来源于stack exchange,提问作者Sim
相关产品推荐
相关产品推荐

