Я пытался использовать проекции 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 : '')}")