HQL中的Collection.contains(Enum.Value)?

时间:2010-03-08 17:11:32

标签: java hibernate hql collections

我对如何在HQL中做某事感到困惑。

所以,假设我有一个Foo类,我坚持休眠。它包含一组枚举值,如下所示:

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

    //getters and setters here ...
}

public enum Bar
{
    A,
    B
}

我是否可以使用HQL语句来获取只有barSet包含Bar.B的Foo实例?

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 个答案:

答案 0 :(得分:5)

您应该映射如下

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

Here您可以看到如何映射

的问候,

答案 1 :(得分:3)

你可以这样做

“从Foo作为foo,其中:foo.barSet的selectedBar成员”

答案 2 :(得分:2)

选择Cat为母亲,Cat为套装 元素中的工具包(foo.kittens)

docs.jboss.org

答案 3 :(得分:0)

我通常更喜欢将枚举集存储为数据库中的位集。它速度极快,需要一个(!)单列。我不知道HQL如何处理位操作,但你可以自己注册。