【发布时间】:2021-05-27 19:27:39
【问题描述】:
我正在处理一个由多个服务使用的查询,但返回的结果数量因过滤而异。
为了避免复制和粘贴查询,我想知道是否可以将一段 sql 传递到 sql 参数中,它会起作用吗?我也愿意接受替代解决方案。
示例:
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("filter", "and color = blue");
namedParameterJdbcTemplate.query(“select * from foo where name = 'Joe' :filter”, parameters, new urobjRowMapper());
【问题讨论】:
-
这样不行,因为参数不是sql语句的一部分,在解析时也不会被解析。它们替换了数据,因此这种方法只能使用动态 SQL。但是如果你不能完全控制参数的内容,这可能会导致 SQL 注入
-
这是灾难的秘诀。我记得早在 2010 年,一位开发人员提出了类似的要求。他希望在应用程序中有一个“秘密页面”,我们可以在其中键入任何 SQL 语句,应用程序就会运行它:“调试问题会更容易”,他说。一年后他被解雇了。
-
我想补充一点,这些过滤器将是常量,所以我不担心 sql 注入。