Как создать Критерии на поле, которое может быть нулевым? - PullRequest
4 голосов
/ 28 марта 2012

Мне нужно создать создать Критерии или Критерий на определенном поле myProperity (на классе MyClass ). Я должен выбрать все объекты, которые имеют prop = null или удовлетворяют определенным критериям . Поэтому я должен сделать что-то вроде:

Criteria criteria = this.sessionManager.getCurrentSession().createCriteria(MyClass.class);

specificCriteria = criteria.createCriteria('myProperity');
/* definition of specificCriteria */

Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.isNull('myProperity'));
disjunction.add(specificCriteria);

criteria.add(disjunction);

Проблема вызвана фактами:

  1. Я не могу добавить Критерии к Disjunction (к Disjunction может быть добавлен только Критерий), поэтому line: disjunction.add (specificCriteria); неправильно
  2. Я не могу каким-то образом изменить конкретный критерий, чтобы принять значение NULL, потому что я не могу определить критерии для NULL. (Это дает мне NullPointerException)

Есть ли у вас идеи, как с этим бороться?

Ответы [ 5 ]

10 голосов
/ 30 марта 2012

Вы можете получить ответ на все вопросы здесь, это поможет вам

, например, если ваш MyClass, как

class MyClass{
   private long id;
   private String myProperity;
   .
   .
   .
   setter & getter
}

, здесь ваша нулевая проблема решена, и это будет работать с другими критериями.

Criteria criteria = session.createCriteria(MyClass.class);

Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.isNull("myProperity"));

criteria.add(disjunction);

criteria.add(Restrictions.eq("id", value));
7 голосов
/ 01 октября 2015

Просто для всех, у кого есть этот вопрос.У меня была похожая проблема, когда я хотел проверить, была ли связанная коллекция пустой и если не ограничена идентификатором.Для достижения этой цели мне помогло следующее (обновленный код для более новой версии hibernate):

Criteria criteria = getSession().createCriteria(StaffMember.class);
criteria.createAlias("franchises", "franchises", JoinType.LEFT_OUTER_JOIN)
        .add(Restrictions.or(
                Restrictions.isEmpty("franchises"),
                Restrictions.in("franchises.id", allowedFranchises)));

Так что это позволяет следующее:

  1. сотрудников без франшиз
  2. сотрудников, имеющих франшизу с удостоверением личности из разрешенной коллекции франшиз
6 голосов
/ 28 марта 2014

Как-то так мне помогло:

final Criteria c = session.createCriteria(House.class)
    // Houses may not have doors.
    .createAlias("door", "door", CriteriaSpecification.LEFT_JOIN)
    // Door may be null, but if it isn't it must be blue.
    .add(Restrictions.or(Restrictions.isNull("door"), Restrictions.eq("door.color", "blue")));

Этот ответ помог мне: https://stackoverflow.com/a/2208458

1 голос
/ 12 июля 2018

Проверьте, если значение, указанное в criteria, равно null, отметьте isNull и примените к вашему criteria, как указано ниже

criteria.add(Restrictions.isNull("parentId"));
0 голосов
/ 01 марта 2019

Метод Restrictions.eqOrIsNull (propertyName, value) может использоваться для обработки нулевых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...