Collection.contains (перечисление. Значение) в HQL?

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

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

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

    //getters and setters here ...
}

и

public enum Bar
{
    A,
    B
}

Есть ли оператор HQL, который я могу использовать для выборки только панели who'se barSet containst экземпляров Foo. B?

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

Или застревают я выбирающий все экземпляры Foo и фильтрующий их на уровне ДАО?

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);
}

Спасибо!

6
задан Seth 8 March 2010 в 17:11
поделиться

3 ответа

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

@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();

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

с уважением,

5
ответ дан 10 December 2019 в 00:37
поделиться

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

"из Foo как foo, где: selectedBar член foo.barSet"

3
ответ дан 10 December 2019 в 00:37
поделиться

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

0
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: