2011-10-18 31 views
3

我有兩個休眠映射實體A和B.使用@Filter冬眠註釋在java中過濾收集

A有實體B的2集,我想基於在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

您可以添加更多的堆棧跟蹤? – ssedano

回答

0

您必須啓用DAO中的過濾器。

session.enableFilter("something"); 

檢索對象之前。

+0

正如你所建議的,我啓用了我的DAO中的過濾器,但得到以下異常:org.hibernate.HibernateException:沒有配置這樣的過濾器[某事] ..我是否需要創建一個FilterDef或在其他地方放置一個條目? – Mahesh

+0

檢查您的過濾器定義特別檢查類型。你應該使用原始類型,如字符串,整數,長和...如果你需要列表發送作爲參數值是重要的;你應該使用setParameterList()而不是setParameter()。 – M2E67

5

我在Entity中使用FilterDef,然後設置我想要使用過濾器的極其集合。在您的例子:

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說,你應該能夠在會話過濾器:

session.enableFilter("filterName") 

而且把PARAMS如果是這樣的話:

session.getEnabledFilter(filterName).setParameter(nameParameter,value);