2011-10-18 11 views
3

I 2人のHibernateマッピングされたエンティティAとB@Filter Javaでアノテーションを休止使用してコレクションをフィルタリング

Aは、エンティティBの2つのコレクションを有しており、IはBに保持されているプロパティに基づいて、各コレクションをフィルタリングしたい持っています(下のコードを参照)。

@FilterDefs() 
class A{ 

@OneToMany(mappedBy = "productType", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@Filter(name = "something", condition = "entityType = 'SKU1'") 
Set<B> set1 = new HashSet<B>(); 

@OneToMany(mappedBy = "productType", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@Filter(name = "something", condition = "entityType = 'SKU2'") 
Set<B> set2 = new HashSet<B>(); 

} 

class B{ 

@ManyToOne(cascade = CascadeType.ALL) 
private A productType; 

@Column(name = "entity_type") 
@Enumerated(EnumType.STRING) 
private EntityType entityType; 
} 

編集: 私のDAOメソッドに以下の提案として、私は、フィルタを有効にしています。しかし、私は次の例外に

org.hibernate.exception.SQLGrammarExceptionを取得しています:私は、イーガーローディング方式を使用している場合は、私が行うには、例外を取得しています コレクション

を初期化できませんでした無効なSQLが生成されていますか?

任意のポインタ?

+0

は、あなたがより多くを追加することができます:それはそうであるならば

session.enableFilter("filterName") 

とのparamsを置く:次に

class A{ @OneToMany(...) @Filter(name = "filterName") Set<B> set2 = new HashSet<B>(); } @FilterDef(name = "filterName", defaultCondition = condition, parameters = {@ParamDef(name = nameParameter, type = typeParameter)}) class B{ } 

ssedanoは、セッション中にフィルタを有効にする必要があります言ったようにスタックトレースの?あなたが示唆したように – ssedano

答えて

0

あなたはDAOでフィルタを有効にする必要があります。

session.enableFilter("something"); 

オブジェクトを取得する前に。

+0

、私は私のDAOでフィルタを有効にしていますが、次の例外を取得しています:org.hibernate.HibernateException:いいえ、そのようなフィルタを構成し、[何か] ..私はFilterDefを作成したり、他の場所のエントリを配置する必要がありますか? – Mahesh

+0

フィルタ定義を確認してください。文字列、整数、長整数型などのプリミティブ型を使用する必要があります。パラメータ値として送信するリストが必要な場合は重要です。 setParameter()の代わりにsetParameterList()を使用する必要があります。 – M2E67

5

私はエンティティにFilterDefを使用して、私は、フィルタを使用したいウィッヒコレクションに設定してください。あなたの例では:

session.getEnabledFilter(filterName).setParameter(nameParameter,value); 
関連する問題