Поле 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 : '')}")

И о внешнем соединении (в вашем случае левое объединение): Да, это нужно для разрешения пустых значений в отношениях.

Другие вопросы по тегам