hibernate executeUpdate错误的受影响行数

时间:2015-02-25 13:54:12

标签: java mysql hibernate jdbc

我正在使用Hibernate 4.1.7和MySQL驱动程序。我有一个非常简单的表 table1 ,它有2列, id label 。 在此表中,有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行更新"。

2 个答案:

答案 0 :(得分:1)

此代码:

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行

答案 1 :(得分:0)

我知道这个问题很旧,但是今天我偶然发现了这个确切的问题,只有在Google进行广泛搜索后才找到答案。

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

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

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

例如当我有一个包含5条包含my_column等于'new_value'的记录和5条包含my_column等于'old_value'的记录时的输出

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时间戳列,则仅在该行受到影响时才更新时间戳。