Collection.contains (Enum.Value) в HQL? - PullRequest
       14

Collection.contains (Enum.Value) в HQL?

6 голосов
/ 08 марта 2010

Я немного озадачен тем, как что-то делать в HQL.

Итак, допустим, у меня есть класс Foo, который я сохраняю в спящем режиме. Он содержит набор значений enum, например:

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

    //getters and setters here ...
}

и

public enum Bar
{
    A,
    B
}

Есть ли инструкция HQL, которую я могу использовать для выборки только тех экземпляров Foo, чей barSet содержит Bar.B?

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

Или я застрял, извлекая все экземпляры Foo и отфильтровывая их на уровне 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);
}

Спасибо!

Ответы [ 4 ]

5 голосов
/ 08 марта 2010

Вы должны отобразить карту следующим образом

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

А ваш HQL выглядит как

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

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

query.list();

Здесь Вы можете увидеть, как отобразить

С уважением,

3 голосов
/ 08 марта 2010

Вы можете сделать это

"из Foo as foo где: selectedBar член foo.barSet"

2 голосов
/ 16 ноября 2010

выберите мать из кошки как мать, кошка как комплект где комплект в элементах (foo.kittens)

docs.jboss.org

0 голосов
/ 08 марта 2010

Я обычно предпочитаю хранить наборы перечислений как наборы битов в базе данных. Это очень быстро и требует один (!) Один столбец. Я не знаю, как HQL обрабатывает битовые операции, но вы можете зарегистрировать свою собственную.

...