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 : '')}")
关于外连接(在你的情况下是左连接):是的,你需要它来允许关系中的空值。
我一直在尝试使用 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 : '')}")
关于外连接(在你的情况下是左连接):是的,你需要它来允许关系中的空值。