Я немного смущен тем, как сделать что-то в 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);
}
Спасибо!
Вы должны отобразить следующим образом
@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();
Здесь вы можете увидеть, как отобразить
с уважением,
Вы можете сделать это
"из Foo как foo, где: selectedBar член foo.barSet"
Я обычно предпочитаю хранить наборы перечислений как битовые наборы в базе данных. Это молниеносно быстро и требует одного (!) единственного столбца. Я не знаю, как HQL обрабатывает битовые операции, но вы можете зарегистрировать свои собственные.