在Enum字段上像Hibernate Like Criteria

时间:2014-11-19 21:00:53

标签: java hibernate enums hibernate-mapping

给出一个Hibernate实体Foo

@Entity
@Table(name = "foo")
class Foo {
    //ID Field

    @Column(name = "bar", nullable = false)
    @Enumerated(EnumType.STRING)
    private Bar bar;

    //Getters, Setters
}

和一个枚举Bar

enum Bar {
    CAT,
    CRADLE,
    SILVER,
    SPOON;
}

我想运行一个查询,检查Foo.bar的值是否包含一些字符串matchString =“ADL”。

目前,我的DetachedCriteria对象构造为:

DetachedCriteria.forClass(Foo.class)
    .add(Restrictions.like("bar", matchString, MatchMode.ANYWHERE));`

但在调用时会导致java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

1 个答案:

答案 0 :(得分:2)

只有在使用String值而不是序号持久化枚举时才能进行这样的查询 - 但即便如此,我也不希望条件API必须支持枚举的类似内容。

您可以找到名称中包含“bar”(在Java代码中)的所有枚举,而不是尝试在数据库级别执行此类操作,然后查询“bar”在该集合中的所有匹配项。这类似于https://stackoverflow.com/a/18899529/4248600

Disjunction or = Restrictions.disjunction();
for (BarEnum bar : BarEnum.values()) {
    if (bar.name().contains(matchStr)) {
        or.add(Restrictions.eq("bar", bar));
    }
}
criteria.add(or);