Spring 当映射实体 returns 'null' 时,投影 @Value 字段失败

Spring Projection @Value field fails when a mapped entity returns 'null'

我一直在尝试使用 Spring 数据 JPA 投影。还使用@Value 注释来连接一些引用投影的一些属性。

当引用的投影之一 return 'null' 时出现问题,因为该特定列在数据库中为空。有什么办法可以解决这个问题吗?即,如果任何引用的投影为空,那么是否可以不使用该投影并仍然使用其他投影的值?

示例代码:

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 表达式语言检查映射投影是否为空。它们将包含在下面给出的括号中。

@Value("#{target.name + ' - ' + (target.rp1 != null ? target.rp1.name : '' )+ ' - ' + (target.rp2 != null ? target.rp2.name : '')}")

如果我正确理解你的问题,你是在询问 Spring 表达式语言中的空值检查。

所以你可以这样做:

@Value("#{target.name + ' - ' + (target.rp1 != null ? target.rp1.name : '') + ' - ' + (target.rp2 != null ? target.rp2.name : '')}")

关于外连接(在你的情况下是左连接):是的,你需要它来允许关系中的空值。