JdbcTemplate 不支持参数化查询“IN”情况?必须通过NamedParameterJdbcTemplate吗?

2024-01-01

为了防止SQL注入攻击,我的项目中的所有SQL语句代码都应该转换为参数化查询。但是当查询条件包含“IN”情况时,我遇到了问题。像这样(使用 DB2 数据库):

String employeeId = 'D2309';
String name = "%brady%";

List<Integer> userRights = new ArrayList<Integer>();
userRights.add(1);
userRights.add(2);
userRights.add(3);

String sql = "SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ? AND NAME LIKE ? 
AND RIGHT IN (?)";

jdbcTemplate.query(sql, new Object[] {employeeId, name, userRights}, new 
EmployeeRowMapper());

上面的代码运行失败,但出现以下异常:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad 
SQL grammar [SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ? AND NAME LIKE ? AND 
RIGHT IN (?)]; nested exception is com.ibm.db2.jcc.am.io: [jcc][1091][10824]
[3.57.82] .... ERRORCODE=-4461, SQLSTATE=42815

这里的问题是JdbcTemplate不支持IN case的参数化查询吗?我知道这项工作可以通过NamedParameterJdbcTemplate来完成,是否只有NamedParameterJdbcTemplate可以进行IN case查询?

多谢。


正如我在评论中已经提到的,我对这个解决方案并不满意,因为它动态生成许多 SQL 语句。给定数量userRights介于 1 和 n 之间,则在缓存中最多需要 n 个准备好的语句。

下面的应该可以工作(我没有尝试过)。

String employeeId = 'D2309';
String name = "%brady%";

List<Integer> userRights = new ArrayList<Integer>();
userRights.add(1);
userRights.add(2);
userRights.add(3);

// build the input string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < userRights.size; i++) {
    sb.append("?");
    if (i < userRights.size() - 1) {
        sb.append(", ");
    }
}

// build the SQL
String sql = "SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ?" +
    " AND NAME LIKE ?" +
    " AND RIGHT IN (" + sb.toString() + ")";

// init the object array
// size is employeeId + name + right
Object[] param = new Object[2 + userRights.size()];

// fill it
param[0] = employeeId;
param[1] = name;

for (int i = 0; i < userRights.size(); i++) {
    param[i + 2] = userRights.get(i);
}

jdbcTemplate.query(sql, param, new EmployeeRowMapper());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JdbcTemplate 不支持参数化查询“IN”情况?必须通过NamedParameterJdbcTemplate吗? 的相关文章

随机推荐

  • 同时进行多个异步回发 - ASP.NET

    说我有2个UpdatePanels在页面和每个UpdatePanel有一台服务器Button每个 当我单击第一个按钮 然后单击第二个按钮并查看 Firebug 时 我发现直到第一个按钮完成后才触发第二个异步回发 这是否按预期工作 我的理解是
  • Excel VBA打印机API,设置颜色和双面打印

    这是我的问题 我正在尝试访问打印机并更改颜色和双面设置 到目前为止 我拥有的代码允许我更改网络打印机的用户首选项 但我有以下两个问题 1 代码将打印机按预期设置为单面或双面 但未正确设置颜色首选项 2 Excel不会自动选择新设置 我仍然需
  • 如何使用 Spring security 创建自己的安全过滤器?

    我想知道是否可以使用 Spring Security API 在 Spring Web 应用程序中创建自己的安全过滤器 我想创建一个通用的安全过滤器 以便只需在 web xml 中添加该过滤器即可将其用于 插入 任何 Web 应用程序 安全
  • 如何动态分配函数代码?

    在 C 语言中 函数指针作为来自某个库的回调的通常途径是包含一个void 用户上下文的指针 void fp void ctx 允许库使用上下文调用回调ctx 假设我使用的库在回调中不包含上下文指针 我需要为每个上下文进行一个回调 在 C 中
  • Cordova Wrapper 应用程序,内部链接在应用程序中加载,外部链接在浏览器中加载

    我有一个简单的Cordova https cordova apache org 包装器应用程序指向外部网页 而不定义任何自己的视图 我想来自该域的所有内部链接都将加载到应用程序内 but 所有外部链接 http twitter com ht
  • 自定义 ostream

    我需要一些指导或指示来了解如何实现自定义 ostream 我的要求是 具有适用于多种数据类型的 目的是将输出发送到数据库 每个 行 应该进入一个单独的记录 每个记录最重要的字段是文本 或 blob 但其他一些字段 例如时间等 大多可以自动推
  • 如何在Cycle.js中顺序请求数据?

    我是响应式编程的新手 正在尝试使用cycle js 试图实现谁关注框本教程 https gist github com staltz 868e7e9bc2a7b8c1f754 但我知道 为了正确实施 和学习目的 我没有一项数据 完整的用户名
  • 使用 jquery 将类添加到父 div

    这应该相当容易 但由于某种原因我很挣扎 我有以下 html 结构 div class div div class changevid div 我想要的是当单击changevid时 应该在子内容之后添加一个名为 active 的类 my co
  • r data.table 就地连接多列

    data table是惊人的 我想进行就地联接 但保留两个表中的所有列 这个问题 https stackoverflow com questions 34598139 left join using data table 34600831演
  • MVC2 的 ASP.Net MVC Future 刷新

    随着 MVC2 的发布 MVC Futures 库的更新包含哪些值得注意的功能 MVC Futures 有两个版本与 MVC 2 RTM 并存 其中一个版本针对 NET 3 5 另一个目标是 NET 4 NET 4 版本不是 NET 3 5
  • 带返回值的 Hangfire 后台作业

    我要从Task Run https msdn microsoft com en us library hh195051 28v vs 110 29 aspx to Hangfire http docs hangfire io en late
  • 简单的 get/post 请求在 python 3 中被阻止,但在 python 2 中则不然

    我正在 python 3 中开发一个简单的网络抓取工具 但是当我发送 get 或 post 请求时 响应是 403 在 python 2 中工作正常 我在两个版本中使用相同版本的请求库 我有 也尝试过Verify False True但两个
  • 使通用扩展方法正常工作时出现问题

    我正在尝试为 HashSet 创建扩展方法 AddRange 以便我可以执行以下操作 var list new List
  • Ruby 与计算机科学相关的产量特性

    我最近发现了 Ruby 的块和屈服特性 我想知道 这在计算机科学理论中适合什么 它是一种函数式编程技术 还是更具体的技术 Ruby s yield与 C 和 Python 中的迭代器不同 yield一旦您了解了 Ruby 中块的工作原理 它
  • 在 Xamarin 中创建完整性计(状态显示)

    我正在尝试设计一个显示进程当前状态的控件 如下图所示 因此 我们有一个圆形的状态显示 其中带有里程碑或检查点的彩色部分 在图中 我们已经完成了前两个阶段 第三阶段已完成 70 我知道 Jquery 中有一个非常相似的控件 但我不确定 Xam
  • org.apache.http.NoHttpResponseException:目标服务器响应失败

    import org apache http HttpEntity import org apache http HttpResponse import org apache http NameValuePair import org ap
  • 即使 prop 没有改变,如何观看呢?

    我有一个与道具同名的观察者 该 prop 在某些事件的父组件中动态设置 我需要每次在父组件上触发事件时触发子组件中具有属性值的某些函数 即使它设置的 prop 是相同的 是否有任何观察者选项或其他处理此类情况的方法可以让我做到这一点 我尝试
  • java.sql.SQLException:参数索引超出范围(2 > 参数数量,即 0)

    public class Brothers extends javax swing JFrame declaring connection and SQL statement Connection cn Statement st Prepa
  • head 的否定参数

    我正在尝试使用head命令 在 macOS 中使用 zsh 代码如下 a txt 1 2 3 4 5 6 7 8 9 10 tail n 5 a txt line 5 to line end tail n 5 a txt last line
  • JdbcTemplate 不支持参数化查询“IN”情况?必须通过NamedParameterJdbcTemplate吗?

    为了防止SQL注入攻击 我的项目中的所有SQL语句代码都应该转换为参数化查询 但是当查询条件包含 IN 情况时 我遇到了问题 像这样 使用 DB2 数据库 String employeeId D2309 String name brady