Поле Spring Projection @Value завершается ошибкой, когда сопоставленная сущность возвращает 'null'
Я пытался использовать проекции Spring Data JPA. Также используется аннотация @Value для объединения некоторых свойств некоторых ссылочных проекций.
Проблема возникает, когда один из указанных проекций возвращает значение "ноль", поскольку этот конкретный столбец является нулевым в БД. Есть ли способ обойти эту проблему? т. е. если какой-либо из указанных проекций является нулевым, то возможно ли не использовать этот прогноз и при этом использовать значения других прогнозов?
Образец кода:
public interface InitialProjection{
String getName();
ReferencedProjection1 getRp1();
ReferencedProjection2 getRp2();
@Value("#{target.name + ' - ' + target.rp1.name + ' - ' + target.rp2.name}")
String getDetail();
}
public interface ReferencedProjection1 {
String getName();
}
public interface ReferencedProjection2 {
String getName();
}
Кроме того, поскольку мне приходится использовать аннотированные методы @Query, похоже, необходимо указать LEFT JOIN для каждой сопоставленной сущности. Это требуется или есть способ не указывать все псевдонимы?
Образец кода:
@Query("SELECT entity.name AS name, "
+ "ljrp1 AS rp1, "
+ "ljrp2 AS rp2 "
+ "FROM Entity entity "
+ "LEFT JOIN entity.rp1 ljrp1 "
+ "LEFT JOIN entity.rp2 ljrp2 "
+ "WHERE entity.isDeleted = 0 ORDER BY entity.name ASC")
List<InitialProjection> fetchAllActiveEntities();
Решение для первой части: как объяснено в принятом ответе, сопоставленные проекции можно проверить на нулевое значение с помощью Spring Expression Language. Они должны быть включены в паратезы, как указано ниже.
@Value("#{target.name + ' - ' + (target.rp1 != null ? target.rp1.name : '' )+ ' - ' + (target.rp2 != null ? target.rp2.name : '')}")
1 ответ
Если я правильно понимаю ваш вопрос, вы спрашиваете о проверках на ноль в Spring Expression Language.
Так что вы могли бы сделать:
@Value("#{target.name + ' - ' + (target.rp1 != null ? target.rp1.name : '') + ' - ' + (target.rp2 != null ? target.rp2.name : '')}")
И о внешнем соединении (в вашем случае левое объединение): Да, это нужно для разрешения пустых значений в отношениях.