Оператор case JPA 2 разрешает null в запросе конструктора

#java #jpa #jpa-2.0 #criteria

#java #jpa #jpa-2.0 #критерии

Вопрос:

У меня есть запрос критериев конструктора. Для конструктора я пытаюсь сделать что-то вроде этого:

 query.select( builder.construct( MyView.class
    , metaObject
    , builder.selectCase( builder.isNull( metaOtherObject )).when( true, null ).otherwise( metaOtherObject.get( MetaOtherObject_.myDateField ))
));
  

Если я использую when(true,null) , то я получаю исключение NullPointerException в этой строке. Если я использую что-то вроде when(true,new Date()) , то это выглядит нормально. Проблема в том, что мне нужно иметь возможность передавать null туда, если OtherObject не был найден. Как я могу это сделать?

Я использую eclipselink в качестве поставщика, использующего postgres.

Ответ №1:

Укажите трассировку стека и версию, которую вы используете.

Обратите внимание, что когда () имеет два метода, один, который принимает Object, и другой, который принимает Expression, убедитесь, что вы каким-то образом не вызываете тот, который принимает Expression.

Ответ №2:

Похоже, мне нужно использовать литеральные методы CriteriaBuilder или nullLiteral. Что-то вроде

 Expression nil = builder.literal(null);
// or
Expression<Date> nilDate = builder.nullLiteral(Date.class);
// then I can 
blah.when(true, nilDate).otherwise(blah)
  

Хотя мой запрос по-прежнему завершается неудачей, он не находится в части конструктора, которую я пытался использовать только null напрямую. Я считаю, что другие проблемы не связаны с этим.