【问题标题】:hibernate executeUpdate wrong number of affected rows [duplicate]休眠executeUpdate错误的受影响行数[重复]
【发布时间】:2015-04-27 13:14:38
【问题描述】:

我正在使用 Hibernate 4.1.7 和 MySQL 驱动程序。我有一个非常简单的表,table1,它有 2 列,idlabel。 在此表中,有 2 行。

我的问题是:当我更新所有行的标签时,它首先告诉我“2 行受影响”。伟大的。当我用相同的值更新相同的行时,它也会告诉我“2 行受影响”。错了,它应该告诉我“0 行受影响”,因为我已经更新了数据。

下面是代码:

public static void Integer doUpdate(){
    final Query query = hbmSesssion.createSQLQuery("UPDATE table1 SET label = 'toto'");
    final Integer result = query.executeUpdate();
    hbmSession.getTransaction().commit();
}

在我的主要:

System.out.println("nb updates: " + doUpdate());
//gives "nb updates: 2", that's OK
//then, I check in the Database, the update is ok, all the lines have 'toto' values
System.out.println("nb updates: " + doUpdate());
//gives "nb updates: 2", that's wrong!

我是否遗漏了文档中的一些重要内容?我对普通的 JDBC 语句也有同样的问题,所以我怀疑是滥用 Java/MySQL 驱动程序。当然,如果我在 PhpMyAdmin 中发送相同的 2 个查询,它首先告诉我“更新了 2 行”,然后是“更新了 0 行”。

【问题讨论】:

  • 很抱歉编辑了我自己的帖子,但我觉得奇怪的是没有人对此有答案。通过 Java 更新 SQL 表是一项很常见的任务...

标签: java mysql hibernate jdbc


【解决方案1】:

我知道这个问题很老了,但我今天偶然发现了这个确切的问题,并且在广泛的 Google 搜索之后才找到答案。

在我的情况下,JDBC 连接本身有一个名为useAffectedRows 的参数。将此参数设置为 true 将使 JDBC 驱动程序返回受影响的行而不是找到的行。我的完整 JDBC URL 看起来像这样:

jdbc:mysql://localhost:3306/test_database?useAffectedRows=true

为了澄清 OP 的问题,MySQL 同时返回匹配/找到的行数和受影响/更改的行数。仅当 UPDATE 查询实际上导致该行的数据发生更改时,该行才被视为受影响/更改。

例如这是当我有一个包含 5 条记录的表时的输出

MySQL [test_database]> update `my_table` set `my_column`= 'new_value';
Query OK, 5 rows affected (0.01 sec)
Rows matched: 10  Changed: 5  Warnings: 0

查询实际上只更改了 5 条记录,因此查询返回 5 行受影响。

另一个副产品是,如果您的表中有一个 ON UPDATE CURRENT_TIMESTAMP 时间戳列,则时间戳只会在该行受到影响时更新。

【讨论】:

  • 我还应该注意,这个标志似乎是特定于实现的。对于您的特定存储引擎,它可能不存在。
【解决方案2】:

这段代码:

public static void Integer doUpdate(){
    final Query query = hbmSesssion.createSQLQuery("UPDATE table1 SET label = 'toto'");
    final Integer result = query.executeUpdate();
    hbmSession.getTransaction().commit();

}

告诉:您必须在 table1 中更新所有放入标签字段值 toto 的行

如果要减少受影响的行数,必须添加WHERE 条件。

例如你可以添加:

UPDATE table1 SET label = 'toto' where label <> 'toto'

在第一次 UPDATE 时使用上面的查询,您将有 2 行受到影响,而在第二次 0 行中

【讨论】:

  • 感谢您的宝贵时间,但这不是问题所在。我知道更新语句的作用!
  • @toni07:如果您在 MySql 上运行这些查询,您将受到两次 2 行的影响
  • 当然不是。在 PhpMyAdmin 上,我有“2 行”,然后是“0 行”,正如我在帖子中提到的那样。此外,与用 PHP (mysql_query) 编写的 Java 代码相同的代码给出了“2 行”然后是“0 行”的确切结果。
  • 在我的 MySql 上总是返回 2 行受影响。
  • 我不知道什么是“你的 MySql”,对我来说 MySql 是系统,唯一能给你“x 行影响”的是 MySql 客户端。你用哪一个?我猜不是很正确,因为“2 行”是错误的,你不同意吗?
猜你喜欢
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 2012-08-06
  • 2018-08-31
相关资源
最近更新 更多