在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
的实际值。
答案 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相同的逻辑作为复合唯一键约束,因此我可以在执行批量插入时消除此类重复)