【问题标题】:Spring Projection @Value field fails when a mapped entity returns 'null'当映射实体返回“null”时,Spring Projection @Value 字段失败
【发布时间】:2019-10-20 17:28:22
【问题描述】:

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

当引用的投影之一返回“null”时会出现问题,因为该特定列在 DB 中为 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 : '')}")

【问题讨论】:

    标签: java spring-data-jpa spring-projections


    【解决方案1】:

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

    所以你可以这样做:

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

    关于外部联接(在您的情况下为左联接):是的,您需要在关系中允许空值。

    【讨论】:

    • 非常感谢您指路。唯一的区别是表达式必须用括号括起来。就像@Value("#{target.name + ' - ' + (target.rp1 != null ? target.rp1.name : '' )+ ' - ' + (target.rp2 != null ? target.rp2.name : '')}") 我将此答案标记为“已接受”。并将在问题中添加我的解决方案。再次感谢
    • 太棒了。很高兴我能帮上忙。我也更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多