【问题标题】:JDBC update query updating all columns, when actually I am updating only few columns更新所有列的 JDBC 更新查询,而实际上我只更新了几列
【发布时间】:2019-11-09 19:35:13
【问题描述】:

我正在尝试使用 JDBC 仅更新少数列。

try (Session session = getSessionFactory().openSession(); Connection connection = SessionUtil.getDBConnection(session)){

    connection.setAutoCommit(false);

    String query = "UPDATE Employee SET fname=?, lname=? where id=?";   
    prepareStatement = connection.prepareStatement(query);

    for (Employee employee : employeeList) {
        for(int i=1; i<=3; i++){
            if(i==1){
                prepareStatement.setString(i, employee.getFName());
            }
            else if(i==2){
                prepareStatement.setString(i, employee.getLName());
            }
            else if(i==3){
                prepareStatement.setString(i, employee.getID());
            }                                   
        }                           
        prepareStatement.addBatch();
    }
    prepareStatement.executeBatch();                                
    connection.commit();
} catch (Exception e) {         
    e.printStackTrace();
} 

这里我试图只更新 Employee 表中的 fname 和 lname。 但是当我检查生成的 SQL 查询(来自 show_sql 日志)时,我可以看到更新查询在其 set 部分中包含所有列。

有没有办法限制更新的列数。 另外,由于我只更新传递给 PreparedStatement 的查询中的 2 列,难道不应该这样做而不是尝试更新所有列吗?

【问题讨论】:

  • 你的 i 不会得到价值 3 ,你需要运行你的循环,即 for(i=1;i&lt;=3;i++)
  • @Swati 抱歉打错了。编辑了帖子。但问题还是一样
  • “但是当我检查生成的 SQL 查询时(来自 show_sql 日志)”是什么意思

标签: java database jpa jdbc prepared-statement


【解决方案1】:

您有三个具有相同isetString 调用,因此您使用getID() 覆盖所有列。只需删除内部 for 循环,您应该就可以了:

for (Employee employee : employeeList) {
     prepareStatement.setString(1, employee.getFName());
     prepareStatement.setString(2, employee.getLName());
     prepareStatement.setString(3, employee.getID());
     prepareStatement.addBatch();
}
prepareStatement.executeBatch();         

【讨论】:

  • 但是你的代码不是也在做同样的事情吗?我的意思是我只是使用一个循环来生成 i 的值,所以对我没有任何影响。还是我在这里遗漏了一些 jdbc 概念?
  • 在我的实际代码库中,我可能不知道在编译时要更新的列数,所以使用循环对我来说是必须的
  • @DockYard no - 您帖子中的循环将每一列设置三次(例如,它用getFName 设置1,然后用getLName 覆盖1,然后用getID 覆盖它,然后与 2 相同,等等...
  • 哎呀,伙计,这是我的一个错误。实际上,我在工作场所遇到了这个问题。由于隐私原因,我更改了结构和变量名称。那里犯了一个错误,将编辑帖子。但即使我的问题仍然相同。即使按照您的方式,生成的 sql 查询也会尝试更新所有列
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
相关资源
最近更新 更多