2010-03-08 8 views
6

Estoy un poco confundido acerca de cómo hacer algo en HQL.Collection.contains (Enum.Value) en HQL?

Digamos que tengo una clase Foo que persisto en Hibernate. Contiene un conjunto de valores de enumeración, así:

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

    //getters and setters here ... 
} 

y

public enum Bar 
{ 
    A, 
    B 
} 

¿Hay una declaración HQL que puedo usar para traer los únicos casos Foo Who'se Barset containst Bar.B?

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

¿O estoy atascado buscando todas las instancias de Foo y filtrándolas en el nivel 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); 
} 

Gracias!

Respuesta

5

Debe correlacionar la siguiente manera

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

Y su HQL parece

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

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

query.list(); 

Here se puede ver cómo asignar

respecto,

2

Usted puede hacer esto

"de Foo como foo donde: selectedBar miembro de foo.barSet"

+0

Gracias. Voy a dar una oportunidad. – Seth

+0

Esto no parece estar funcionando ... ¿me puede indicar un tutorial sobre cómo usar "miembro de"? – Seth

0

Por lo general, prefiero almacenar conjuntos enum como bitsets en la base de datos. Es increíblemente rápido y requiere una sola (!) Columna. No sé cómo maneja HQL las operaciones de bits, pero puede registrar las suyas propias.

2

seleccione madre de Cat como madre, Cat como kit donde kit en elementos (foo.kittens)

docs.jboss.org