2009-11-27 7 views
7

たびたび「org.hibernate.QueryException:duplicate association path:myAssociation」を取得します。これは、私が作業している複雑な基準が、多くの場所で同じパスを定義できるためです。associationPathの基準を取得する

Criteria association = myCriteria.getAssociation("wax"); 
if(association == null) association = myCriteria.createCriteria("wax"); 

既に関連付けられているかどうかを確認できる方法はありますか?

乾杯

ニック

+0

あなたが望む名前がまだ取られていないと思っているのではなく、クエリでユニークなエイリアスを使用するのは意味がありませんか? – skaffman

答えて

3

クライテリアAPI経由でそれをする方法はありません。ただし、実際にこれが発生する必要がある場合は、自分でMapを維持することはできます。

次のいずれかを実行できます

  • は、各基準のインスタンスごとに1つのマップ、別名をキーとネストされた基準を持っています。
  • には、1つのグローバルマップがあります。そのキーには、ネストされた条件のエイリアスとルートから現在の条件へのパスの両方が必要です。
+0

ええ、これは私がやったことです。私はひどくたくさんのif-testとputsを節約することができますが、それらを見ることができればうれしいです。 :-) – niklassaers

5

実際には、エイリアス別の基準を見つけることはできますが、コードは公開されていません(CriteriaImplクラス)。以下の私の例を参照してください:

private Subcriteria getCritria(Criteria pCriteria, String pAlias) { 
    Iterator<Subcriteria> iter = ((CriteriaImpl)pCriteria).iterateSubcriteria(); 
    while (iter.hasNext()){ 
     Subcriteria sub = iter.next(); 
     if (pAlias.equals(sub.getAlias())){ 
      return sub; 
     } 
    } 
    return null; 
} 
+2

優れたソリューション! – samz

関連する問題