使用NamedParameterJdbcTemplate结合PostgreSQL实现LIKE模糊查询
解决PostgreSQL + NamedParameterJdbcTemplate模糊查询语法错误问题
以下是几种适配你现有代码结构的可行方案:
方式一:SQL中用字符串连接符拼接%(推荐)
直接通过PostgreSQL的||连接符在SQL里将%与占位符拼接,参数仅传入实际要匹配的关键词(无需带%)。
修改后的SQL片段示例:
WHERE 1=1 and ( CAST(rf.date AS varchar) LIKE '%' || :date || '%' OR 'getAll' = :date ) and ( CAST(krr.id AS varchar) LIKE '%' || :id || '%' OR 'getAll' = :id )
参数传入规则:模糊查询传具体关键词(如"2024"),查询全部传"getAll"。
方式二:使用PostgreSQL的CONCAT函数拼接
若习惯用函数实现拼接,可使用CONCAT函数,语法如下:
WHERE 1=1 and ( CAST(rf.date AS varchar) LIKE CONCAT('%', :date, '%') OR 'getAll' = :date ) and ( CAST(krr.id AS varchar) LIKE CONCAT('%', :id, '%') OR 'getAll' = :id )
逻辑与方式一完全一致,参数同样只需传具体关键词或"getAll"。
方式三:参数直接传入带%的字符串
若坚持在参数中传入"%xxx%"格式的值,需调整SQL的逻辑判断,确保getAll分支与模糊查询分支互不冲突:
WHERE 1=1 and ( 'getAll' = :date OR CAST(rf.date AS varchar) LIKE :date ) and ( 'getAll' = :id OR CAST(krr.id AS varchar) LIKE :id )
参数传入规则:模糊查询传"%2024%",查询全部传"getAll"。
注意事项
- 若字段本身为varchar类型,可去掉
CAST转换,减少不必要的性能损耗。 - 三种方案均基于NamedParameterJdbcTemplate的参数绑定机制,不存在SQL注入风险。
内容的提问来源于stack exchange,提问作者PaulJK
相关产品推荐
相关产品推荐

