2010-03-08 4 views
6

Je suis un peu confus sur la façon de faire quelque chose en HQL.Collection.contains (Enum.Value) dans HQL?

Alors disons que j'ai un Foo de classe que je persiste en hibernation. Il contient un ensemble de valeurs ENUM, comme ceci:

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

    //getters and setters here ... 
} 

et

public enum Bar 
{ 
    A, 
    B 
} 

Y at-il une déclaration HQL je peux utiliser pour récupérer uniquement les instances de Foo who'se Barset containst Bar.B? Ou suis-je bloqué en récupérant toutes les instances de Foo et en les filtrant au niveau 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); 
} 

Merci!

Répondre

5

Vous devez mapper comme suit

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

Et votre HQL ressemble

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

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

query.list(); 

Here vous pouvez voir comment la carte

salutations

2

Vous pouvez le faire

"de Foo comme foo où: selectedBar membre de foo.barSet"

+0

Merci. Je vais donner un coup de feu. – Seth

+0

Cela ne semble pas fonctionner ... pouvez-vous me montrer un tutoriel sur la façon d'utiliser "membre de"? – Seth

0

Je préfère généralement stocker des ensembles d'énumération comme des bitsets dans la base de données. Il flambe rapidement et nécessite une (!) Seule colonne. Je ne sais pas comment HQL gère les opérations sur les bits, mais vous pouvez enregistrer les vôtres.

2

mère selection from Cat as mère, Cat comme kit où le kit dans des éléments (foo.kittens)

docs.jboss.org