2010-03-08 61 views
6

我對如何在HQL中做些什麼感到困惑。HQL中的Collection.contains(Enum.Value)?

所以,假設我有一個Foo類,我堅持休眠。它包含一組枚舉值,像這樣:

public class Foo 
{ 
    @CollectionOfElements 
    private Set<Bar> barSet = new HashSet<Bar>(); 

    //getters and setters here ... 
} 

public enum Bar 
{ 
    A, 
    B 
} 

是否有HQL語句,我可以用它來只獲取富實例who'se barSet containst Bar.B?

List foos = session.createQuery("from Foo as foo " + 
"where foo.barSet.contains.Bar.B").list(); 

還是我堅持取回所有的Foo實例,並在DAO級過濾出來?

List foos = session.createQuery("from Foo as foo").list(); 

List results = new ArrayList(); 

for(Foo f : foos) 
{ 
    if(f.barSet.contains(Bar.B)) 
    results.add(f); 
} 

謝謝!

回答

5

您應映射如下

@CollectionOfElements 
@Enumerated(EnumType.STRING) 
@JoinTable(
    name="BAR_TABLE", 
    [email protected](name="FOO_ID") 
) 
public Set<Bar> getBarSet() { 
    return this.BarSet; 
} 

而且你的HQL看起來像

select distinc Foo _foo inner join fetch _foo.barSet bar where bar = :selectedBar 

query.setParameter("selectedBar", Bar.A); 

query.list(); 

Here你可以看到如何映射

問候,

2

你可以做到這一點

「從富作爲foo其中:於foo.BARSET的selectedBar構件」

+0

感謝。我會給這個鏡頭。 – Seth 2010-03-08 21:38:04

+0

這似乎沒有工作......你能指點我如何使用「成員」的教程? – Seth 2010-04-28 20:39:55

0

我通常喜歡存儲枚舉集作爲在數據庫中的位集。它的速度非常快,需要一個(!)單列。我不知道HQL如何處理位操作,但可以註冊自己的操作。從貓

2

選擇母親的母親,貓作爲試劑盒 其中元件(foo.kittens)試劑盒

docs.jboss.org