【问题标题】:Hibernate Like Criteria on Enum field枚举字段上的 Hibernate Like Criteria
【发布时间】:2015-01-17 13:32:12
【问题描述】:

给定一个休眠实体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

【问题讨论】:

  • 如果您使用enum,那是因为您有一组已定义的值。将enum 用作enum,而不是强制使用String。使用in 和您需要的值。
  • @BoristheSpider,用例是用户实时过滤Foo 列表,以便在用户键入时过滤项目。
  • 就 UI 而言,enum 应该是一个下拉菜单。

标签: java hibernate enums hibernate-mapping


【解决方案1】:

只有当枚举使用字符串值而不是序数来持久化时,这样的查询才有可能 - 但即使这样,我也不希望条件 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2010-09-29
    • 2019-07-11
    • 2016-07-01
    相关资源
    最近更新 更多