我正在使用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行更新"。
答案 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时间戳列,则仅在该行受到影响时才更新时间戳。