Критерии гибернации с динамическими ограничениями ИЛИ

Я хотел бы динамически добавлять ограничения ИЛИ к критериям Hibernate на основе количества элементов в массиве.

В приведенном ниже примере Project — это объект, а @OneToMany свойство объекта User. Объект Project имеет свойство name. db.getSes() предоставляет текущий Session.

Мой текущий подход

String[] project_name_filters = {"Project Name 1","Project Name 2"};

Criteria q = db.getSes().createCriteria(User.class);

if(project_name_filters.length > 0) {
    q.createAlias("project", "project");

    LogicalExpression or_exp = null;

    for(int ix_prj = 0 ; ix_prj < project_name_filters.length ; ix_prj++) {
            or_exp = Restrictions.or (or_exp,Restrictions.eq("project.name", project_name_filters[ix_prj]));
        }   

    q.add(or_exp);
}

@SuppressWarnings("unchecked")
List<User> users = (List<User>) q.list(); 

но инициализация or_exp = null не подходит.

Я даже не уверен, что это способ реализовать динамический набор ограничений ИЛИ для запроса гибернации.

Как я должен это делать?


person Jose Ospina    schedule 30.05.2015    source источник
comment
Начните с допустимого, но невозможного условия.   -  person fzzfzzfzz    schedule 30.05.2015
comment
так что структура в порядке, мне просто нужно инициализировать or_exp как false. Но как это сделать правильно? Можете ли вы привести пример действительного, но невозможного условия?   -  person Jose Ospina    schedule 30.05.2015
comment
Вот почему я прокомментировал вместо ответа - я сделал это только с необработанными строками SQL :) В необработанном SQL вы должны начать с чего-то вроде 1 != 1 и добавить к нему операторы OR. Я недостаточно хорошо знаю критерии Hibernate, чтобы дать эквивалент.   -  person fzzfzzfzz    schedule 30.05.2015


Ответы (1)


Начните с чего-то, что наверняка будет ложным.

Вы можете использовать Restrictions.sqlRestriction, чтобы создать такое условие с помощью необработанного SQL:

Criterion impossibleCriterion = Restrictions.sqlRestriction("(1=0)");
LogicalExpression or_exp = Restrictions.or(impossibleCriterion, impossibleCriterion);
person fzzfzzfzz    schedule 30.05.2015