2014-11-19 2 views
2

Учитывая гибернации Entity FooHibernate Как критерии на поле Enum

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

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

    //Getters, Setters 
} 

И в Enum Bar

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

Я хотел бы выполнить запрос проверки, если значение foo.bar содержит некоторую строку matchString = «АДЛ».

В настоящее время, мой объект 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 при вызове.

+0

Если вы используете 'enum', то это потому, что у вас есть определенный набор значений. Используйте 'enum' как' enum' не как принудительный 'String'. Используйте 'in' и значения, которые вам нужны. –

+0

@BoristheSpider, прецедент предназначен для того, чтобы пользователь мог фильтровать список 'Foo', так как пользователь набирает элементы, которые фильтруются. – BenIntelliData

+0

Что касается UI, значит, 'enum' должен быть выпадающим списком. –

ответ

2

Такой запрос будет возможен только в том случае, если перечисление сохраняется с использованием значения String, а не порядкового номера, но даже тогда я не ожидал, что API-критерий обязательно будет поддерживать подобное для перечислений.

Вместо того чтобы пытаться сделать подобное на уровне базы данных, вы можете найти все перечисления, в которых имя содержит «бар» (в коде Java), а затем запрашивать все совпадения, в которых «бар» находится в этом наборе. Это похоже на 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); 
Смежные вопросы