2010-03-08 12 views
6

Sono un po 'confuso su come fare qualcosa in HQL.Collection.contains (Enum.Value) in HQL?

Quindi diciamo che ho una classe Foo che sto persistendo in ibernazione. Esso contiene una serie di valori enum, in questo modo:

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

    //getters and setters here ... 
} 

e

public enum Bar 
{ 
    A, 
    B 
} 

C'è una dichiarazione HQL posso usare per andare a prendere solo le istanze di Foo who'se Barset containst Bar.B?

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

Oppure sono bloccato a recuperare tutte le istanze di Foo e filtrarle a livello di 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); 
} 

Grazie!

risposta

5

Si dovrebbe mappare come segue

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

E la tua HQL assomiglia

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

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

query.list(); 

Here si può vedere come la mappa

saluti,

2

Si può fare questo

"da Foo come foo dove: selectedBar membro del foo.barSet"

+0

Grazie. Darò uno scatto. – Seth

+0

Questo non sembra funzionare ... puoi indicarmi un tutorial su come usare "member of"? – Seth

0

io di solito preferisco memorizzare set di enum come bitsets nel database. È veloce e richiede una (!) Singola colonna. Non so come HQL gestisca le operazioni di bit, ma puoi registrare il tuo.

2

selezionare madre da Cat come madre, gatto come kit dove kit di elementi (foo.kittens)

docs.jboss.org