Hibernate合并where子句

时间:2016-11-11 21:01:38

标签: java hibernate

我已经四处寻找这个答案,但我找不到任何可以回答我问题的内容。

我正在使用一个使用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子句中,就像选择语句一样。

有谁知道我可以做些什么才能将其添加到更新声明中?

感谢您的帮助。

1 个答案:

答案 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);
    }
}

所以我不得不逐出实体以防止任何其他更新在以后触发更新。然后执行了更新,如果没有更新行,则执行插入。