我已经四处寻找这个答案,但我找不到任何可以回答我问题的内容。
我正在使用一个使用Hibernate的应用程序,它使用session.merge(object)
来更新或插入对象。插入工作正常,但如果存在具有(A,B)相同值的多个记录,则由于数据库字段(A,B,C)上的唯一约束,更新将失败。 Hibernate模型只有字段(A,B)定义为id,它没有(A,B,C),因为在选择或更新记录时,只需要返回空值为C的记录(C是终止日期,其中null表示活动,非null表示不活动)。
在Hibernate模型文件(Table.hbm.xml)中,它的where子句定义如下:
<class name="..." table="..." lazy="true" batch-size="10" where="C is null">
在执行选择时会插入它,但在执行merge语句时,update语句不会将其作为where子句的一部分。生成的更新类似于:
update table
set ...
where A=?
and B=?
这很好,但我想要的是将Hibernate模型文件中的where子句(C is null
子句)添加到where子句中,就像选择语句一样。
有谁知道我可以做些什么才能将其添加到更新声明中?
感谢您的帮助。
答案 0 :(得分:0)
我不认为可以使用Hibernate模型中的where子句从合并中更新update语句中的where子句。
我最终要解决的问题是做这样的事情:
void update(EntityName entity){
session.evict(entity);
Query update = session.createSQLQuery(
"update table_name "
+ "set c1 = ?,"
+ "c2 = ? "
+ "where A = ? "
+ "and B = ? "
+ "and C is null" //this was the line that was needing to be added
);
//set the parameter values
if(update.executeUpdate() == 0){
session.save(entity);
}
}
所以我不得不逐出实体以防止任何其他更新在以后触发更新。然后执行了更新,如果没有更新行,则执行插入。