7 votes

Collection.contains(Enum.Value) dans HQL ?

Je suis un peu confus sur la façon de faire quelque chose en HQL.

Disons que j'ai une classe Foo que je fais persister dans Hibernate. Elle contient un ensemble de valeurs d'énumération, comme ceci :

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

    //getters and setters here ...
}

y

public enum Bar
{
    A,
    B
}

Existe-t-il une instruction HQL que je peux utiliser pour récupérer uniquement les instances de Foo dont le barSet contient Bar.B ?

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

Ou suis-je obligé de récupérer toutes les instances de Foo et de les filtrer au niveau de la 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 !

5voto

Arthur Ronald Points 19001

Vous devez cartographier comme suit

@CollectionOfElements
@Enumerated(EnumType.STRING)
@JoinTable(
    name="BAR_TABLE",
    joinColumns=@JoinColumn(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();

Ici vous pouvez voir comment cartographier

regards,

3voto

Vous pouvez le faire

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

2voto

Dani Points 21

Select mother from Cat as mother, Cat as kit où kit dans elements(foo.kittens)

docs.jboss.org

0voto

whiskeysierra Points 2175

Je préfère généralement stocker les ensembles d'enum sous forme de bitsets dans la base de données. C'est très rapide et ne nécessite qu'une ( !) seule colonne. Je ne sais pas comment HQL gère les opérations sur les bits mais vous pouvez enregistrer les vôtres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X