Hibernate @SQLInsert和On Duplicate Key

时间:2015-02-18 09:35:09

标签: mysql hibernate insert-update

在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)都在工作 - 但我需要设置已通过insert-call传递的colB的实际值。

1 个答案:

答案 0 :(得分:0)

正确的答案是使用以下声明:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB);

然而,一旦执行了update语句,问题就出现了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个实体实例代表同一个数据库行 - 这是不允许的。

要解决这个问题,只需要确保不要插入由于约束而渲染的2个实体。 (我使用与equals / hashcode相同的逻辑作为复合唯一键约束,因此我可以在执行批量插入时消除此类重复)