简体   繁体   English

枚举字段上的像休眠标准

[英]Hibernate Like Criteria on Enum field

Given a Hibernate Entity Foo 给定一个休眠实体Foo

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

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

    //Getters, Setters
}

And an Enum Bar 还有一个枚举Bar

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

I would like to run a query checking if Foo.bar's value contains some String matchString = "ADL". 我想运行一个查询,检查Foo.bar的值是否包含某些String matchString =“ ADL”。

Currently, my DetachedCriteria object is constructed as: 当前,我的DetachedCriteria对象构造为:

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

but causes a java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum when invoked. 但是会导致java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum调用时java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

A query like this would only be possible if the enum is persisted using the String value rather than the ordinal - but even then I would not expect the criteria API to necessarily support a like for enums. 这样的查询只有在使用String值而不是序数来持久化枚举的情况下才有可能-但是即使那样,我也不希望标准API一定要支持枚举的like。

Instead of trying to do the like at the database level you can find all the enums where the name contains "bar" (in Java code) and then query for all the matches where "bar" is in that set. 您可以查找名称中包含“ bar”(在Java代码中)的所有枚举,然后查询该集中“ bar”中的所有匹配项,而不是尝试在数据库级别执行此类操作。 This is similar to https://stackoverflow.com/a/18899529/4248600 . 这类似于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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM