在 Hibernate 中,您可以使用 @SQLInsert
定义自定义插入查询。 Hibernate 使用准备好的语句,因此您只需提供 ?
作为占位符,如下所示:INSERT INTO table (colA, colB) VALUES (?,?)
在 colA
的重复键上,我要colB
要更新为新值,所以我尝试 INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY UPDATE colB = ?
- 然而,这会引发没有给出第三个参数的错误。 (没有为参数 3 指定值)
如何为 hibernate 编写此查询的正确方法?任何不依赖数据的更新,例如 INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY UPDATE colB = colB +1
正在工作 - 但我需要设置 colB
的实际值已通过插入调用传递。
最佳答案
正确的答案是使用以下语句:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
然而,问题出现了,一旦执行了更新语句,hibernate 就没有收到自动增量值。
我找到了以下博客文章 ( http://www.jroller.com/mmatthews/entry/getting_hibernate_and_mysql_s ) 并将查询修改为以下内容:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
终于起作用了。
这种方法的一个无法解决的问题是,在同一事务中插入两个相等的实体不起作用。即使第二次插入会导致正确的更新,em 最终也会得到代表同一数据库行的 2 个实体实例 - 这是不允许的。
要解决这个问题,只需确保您不会插入两个由于约束而呈现相等的实体。 (我对 equals/hashcode 使用了与复合唯一键约束相同的逻辑,因此我能够在执行批量插入时消除此类重复项)
关于mysql - Hibernate @SQLInsert 和重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580151/