2011-12-21 6 views
1

Hibernateでプロジェクトを移行しています(JBoss5.1.0GAに埋め込まれているバージョンが3.xのように見えません)。IN述部でSQL Server + hibernateコンポジットキーが失敗する

HQLのクエリの一つは次のようになります。MSSQLで

... 
FROM k join k.defs kd 
    ... 
WHERE ... 
    kd not in (SELECT d.defs FROM d ...) 

このクエリが実行され(失敗した)のように:私の​​エンティティは、2つのフィールドITEM_IDとDEF_IDの化合物の鍵を持っている

.... 
WHERE 
    ( 
    (kd.ITEM_ID, kd.DEF_ID) not in (
     SELECT 
      defs.ITEM_ID, defs.DEF_ID 

。 Oracleと比較して、複合語IN述語はサポートされていないため、SQL Serverは失敗します。

明らかに、これはHibernateによって生成されたマッピングのバグです。私の質問は:登録サンプルのフィールドごとの比較を提供するためにHibernateを構成/パッチする方法は?

答えて

0

これは同じことを達成するはずです。左外部結合には、k内のすべての行と、dからの行がonに一致する行が含まれます。 dは一致しない場合はnullです。私の構文は少しはずれているかもしれません - 私はどこでそれをテストできるかはわかりませんが、これがあなたを始めることを願っています。

FROM k join k.defs kd 
left outer join d.defs kd 
    ... 
WHERE ... 
    d is null 
+0

私の質問にご注意いただきありがとうございます。 'NOT EXISTS'は' NOT IN'述語を置き換えるよりエレガントな方法です。しかし、私は最後の解決策として残すつもりです。コードは従来のものであり、変更は副作用を引き起こす可能性があるからです。だから、ハイバネーションを使って操作することには疑問があります - パッチを当てる(いくつかの上位バージョンや特定のクラスを変更するかもしれません)。 – Dewfy

関連する問題