2010-03-08 3 views
6

Ich bin ein wenig verwirrt über etwas in HQL zu tun.Collection.contains (Enum.Value) in HQL?

Also sagen wir, ich habe eine Klasse Foo, die ich im Winterschlaf persistiere. Es enthält eine Reihe von ENUM-Werte, etwa so:

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

    //getters and setters here ... 
} 

und

public enum Bar 
{ 
    A, 
    B 
} 

Gibt es eine HQL Aussage, die ich nur Foo Instanzen holen können who'se Barset Bar.B containst?

Oder bin ich fest, alle Foo-Instanzen zu holen und sie auf der DAO-Ebene ausfiltern?

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); 
} 

Vielen Dank!

Antwort

5

sollten Sie ordnen sich wie folgt

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

Und Ihre HQL sieht aus wie

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

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

query.list(); 

Here Sie sehen können, wie

Bezug zur Karte,

2

Sie können diese

tun

"von Foo als foo wo: selectedBar Mitglied von foo.barSet"

+0

Dank. Ich gebe das eine Chance. – Seth

+0

Dies scheint nicht zu funktionieren ... können Sie mich auf ein Tutorial zur Verwendung von "Mitglied von" zeigen? – Seth

0

Normalerweise bevorzuge ich Enum-Sets als Bitsets in der Datenbank zu speichern. Es ist blitzschnell und benötigt eine (!) Einzelne Spalte. Ich weiß nicht, wie HQL Bitoperationen behandelt, aber Sie können Ihre eigenen registrieren.

2

wählen Mutter von Katze als Mutter, Katze als Bausatz wo Kit in Elemente (foo.kittens)

docs.jboss.org