所以我有以下投影类
@Data
@AllArgsConstructor
public class CommentDTO3 {
private Long id;
private String comment;
private Long userId;
private Long placeId;
private String userUserProfileFirstName;
}
这很好用,但是我想将userUserProfileFirstName
属性命名为comentator_name
。有可能做这样的事情:
@Value("user.userProfile.firstName")
private String userUserProfileFirstName;
我测试了那个特定的例子,但@Value注释似乎被忽略了。
我对使用@Query
注释提供自定义构造函数不感兴趣。
修改
这对我有用:
@JsonProperty("userName")
private String userUserProfileFirstName;
这个不适用
@JsonProperty("userName")
@Value("#{target.user.userProfile.firstName}")
private String userName;
并且在启动时失败:
org.springframework.data.mapping.PropertyReferenceException: No property name found for type User! Traversed path: Comment.user.
https://gist.github.com/Antoniossss/7ab00c180013f707ef9a8cdc2d53e807
答案 0 :(得分:1)
我没有将class-based projections与@Value
一起使用的经验,但使用'interface'projections我们可以使用@Value
来提供一些计算:
public interface CommentProjection {
Long getId();
String getComment();
@Value("#{target.user.id}")
Long getUserId();
@Value("#{target.place.id}")
Long getPlaceId();
@Value("#{target.user.userProfile.firstName}")
String getComentatorName();
}
<强>更新强>
我检查了基于类的预测 - 它们不适用于@Value
。尝试使用与Entity属性名称不同的DTO属性名称会导致抛出异常PropertyReferenceException: No property <property> found for type <Entity>!
并阻止Spring上下文运行。
@Data
public class CommentProjection {
@Value("#{target.user}")
private final User theUser; // throw PropertyReferenceException: No property theUser found for type Comment!
}
我的demo project。
<强>更新强>
我发布了一个错误报告:DATAJPA-1186
<强>更新强>
这不是一个错误,它是一个feature。
答案 1 :(得分:0)
基于接口,在我的情况下,@ Value和@JsonProperty开箱即用,例如:这一个
@Projection(types = { Project.class }, name = "website")
public interface ProjectWebAPIProjection {
Long getId();
@JsonProperty("geo-x")
@Value("#{target.objekt?.xKoordinate}")
Double getGeoX();
// ...
}