2016-11-11 14 views
0

私はこの答えを見回しましたが、私の質問に答えたものは見つかりませんでした。Hibernate merge where節

私は、Hibernateを使用するアプリケーションで作業しており、session.merge(object)を使用してオブジェクトの更新または挿入を行います。挿入は正常に機能しますが、(A、B)と同じ値を持つ複数のレコードが存在する場合、データベースフィールド(A、B、C)のユニーク制約のために更新が失敗します。 Hibernateモデルはidとして定義されたフィールド(A、B)しか持たず、(A、B、C)を持たない。なぜなら、レコードを選択または更新するとき、Cのヌル値を持つレコードのみが返されたいからである終了日はnullがアクティブで非nullはアクティブでないことを意味します)。選択を行う際に挿入されます

<class name="..." table="..." lazy="true" batch-size="10" where="C is null"> 

が、MERGE文、UPDATE文を実行する:Hibernateのモデルファイル(Table.hbm.xml)で

、次のように句が定義された場所を持っていますこれはwhere句の一部としてはありません。生成された更新があるようなもの:細かいですが、私が希望することがあるようにもHibernateのモデルファイル(C is null節)からwh​​ere句を持つようにwhere句に追加される

update table 
set ... 
where A=? 
and B=? 

selectステートメントの場合

私は更新ステートメントに追加するために何ができるか知っていますか?

ありがとうございました。

答えて

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

だから私は後で更新をトリガするから、他の更新を防止することを企業に立ち退かなければならなかった:私はこの問題を解決するためにやってしまった何を

はこのような何かをすることでした。次に、更新が実行され、更新された行がない場合、挿入が実行されます。