2012-02-13 11 views
4

私はエンティティを持っていますが、collectionsフィールド(params)を持っています。多くのパラメータがあります。一意の各パラメータに対して一意の結合を作成したいつまりp1.id = ? AND p2.id = ? AND p3.id = ?などHibernateフィールド複数エイリアス

Hibernateでは、同じフィールドのエイリアスを作成しようとすると、重複エイリアスに関するメッセージで例外がスローされます。

フィールドに複数の結合を行うにはどうすればよいですか?

私は春のフレームワーク、hibernateとpostgresqlを使用しています。

ありがとうございます。

+2

クエリのコードと例外のスタックトレースを表示します。 –

+0

問題を解決しました。このリンクでは、下の "https://forum.hibernate.org/viewtopic.php?f=1&t=943274"に「OuterJoinLoaderに深い制限があり、同じ関連付けが2回行われないようにしています。それは私が知る上で重要でした。だから私はCriteria APIではなくHQLの問題を解決することに決めました。 – J3DI

+0

あなたの質問にCriteria APIを使用していることが少なくとも記述されている場合、またはコードを表示していた場合はすぐにそのことを教えてください。 –

答えて

2

私はあなたがCriteria APIを使用していると仮定します。

あなたが休止状態のソースコードをチェックする場合は、ここで問題を見つけることができます:私は休止状態3.3.2使用してい

CriteriaQueryTranslator#createAssociationPathCriteriaMap() 

private void createAssociationPathCriteriaMap() { 
     Iterator iter = rootCriteria.iterateSubcriteria(); 
     while (iter.hasNext()) { 
      CriteriaImpl.Subcriteria crit = (CriteriaImpl.Subcriteria) iter.next(); 
      String wholeAssociationPath = getWholeAssociationPath(crit); 
      Object old = associationPathCriteriaMap.put(wholeAssociationPath, crit); 
      if (old != null) { 
       throw new QueryException("duplicate association path: " + wholeAssociationPath); 
      } 
      int joinType = crit.getJoinType(); 
      old = associationPathJoinTypesMap.put(wholeAssociationPath, new Integer(joinType)); 
      if (old != null) { 
       // TODO : not so sure this is needed... 
       throw new QueryException("duplicate association path: " + wholeAssociationPath); 
      } 
     } 
    } 

。内部で何が起こる

はあなたのルートにCriteria Sを追加する場合Criteria HibernateはSubCriteria Sを作成し、後でMapを使用しようとしているすべてのパスを(以下のコードをチェックしてください)埋めていることであり、重複を見つけた場合、それ例外がスローされます。

たとえば、参加しようとしている場合:entity0.entity1以降では、再び参加しようとするとExceptionが返されます。これは、Hibernateがここでそれらを気にしないので、エイリアスでも動作しません。

何かを何度も参加させないか、HQL/JPQLを使うことができます。あなたは新しいバージョンのHibernateをチェックアウトするかもしれませんが、私がこれらの疑似バグを修正したかどうかは分かりません。

関連する問題