无法将值放入Java Spring启动中的SQL语句中

无法将值放入Java Spring启动中的SQL语句中,java,sql,spring-boot,jdbctemplate,Java,Sql,Spring Boot,Jdbctemplate,我有私有静态最终字符串SQL\u SEARCH\u ALL=“SELECT*FROM product WHERE name LIKE“%”?%”SQL语句,其中我需要传递一个查询字符串。当我传递一个类似于'%cola%'的字符串,而不是?标记时,它工作正常 我使用JdbcTemplate传递paramater,就像以前一样 return jdbcTemplate.query(SQL_SEARCH_ALL, new Object[]{searchInput}, productRowMapper);

我有
私有静态最终字符串SQL\u SEARCH\u ALL=“SELECT*FROM product WHERE name LIKE“%”?%”SQL语句,其中我需要传递一个查询字符串。当我传递一个类似于
'%cola%'
的字符串,而不是
标记时,它工作正常

我使用JdbcTemplate传递paramater,就像以前一样

return jdbcTemplate.query(SQL_SEARCH_ALL, new Object[]{searchInput}, productRowMapper);
返回零个对象


我在将值传递到此语句时遇到问题。

JDBC参数不是在使用
标记的任何地方替换的字符串;这将打开对SQL注入的查询。根据每个数据库和每个JDBC驱动程序,
参数标记的允许位置各不相同

可以肯定地说,参数通常可以到达典型文本值可以到达的地方,但情况并非总是如此。例如,在DB2中,子句
只获取前5行
不接受
而不是文本
5

在您的情况下,典型的解决方案是使用
CONCAT()
。例如:

private static final String SQL_SEARCH_ALL =
  "SELECT * FROM product WHERE name LIKE CONCAT('%', ?, '%')";

当然,如果提供了null参数,您需要决定希望发生什么。这里可能有一个
COALESCE()
函数。

在Java(或任何语言)中执行此操作的标准方法是使用单个
占位符,然后将通配符表达式绑定到该占位符:

private static final String SQL\u SEARCH\u ALL=“SELECT*FROM product WHERE name LIKE?”;
字符串searchInput=“%cola%”;
返回jdbcTemplate.query(SQL_SEARCH_ALL,新对象[]{searchInput},productRowMapper);

这可能不起作用,因为您试图将通配符
占位符连接到两侧的
%
。相反,这里应该使用一个
占位符。@TimBiegeleisen我不知道你在说什么。该语句可以正常工作,例如
ps.setString(1,“lamp”),则它会发现
lamp
显示在其
名称
列的任何地方的任何产品,并且我所知道的每个JDBC库都允许在该位置使用
。@rzwitserloot不同意您之前的评论。@TimBiegeleisen您误解了这个答案。去试试吧,它很好用。@rzwitserroot我刚刚用Lombok库做了一个小的Spring Boot项目。好东西,它有助于使我的Java代码尽可能少。