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

如何让Java Repository传递的keyword参数被PSQL识别为变量

问题根因

你的写法存在两个问题导致参数无法被识别:

  1. SQL中被单引号包裹的%keyword%会被PostgreSQL直接识别为固定字符串常量,不会和@Param绑定的入参做关联
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:54:04