是否可以在Spring数据中的投影类上指定属性名称?

时间:2017-09-21 16:26:44

标签: java spring spring-data

所以我有以下投影类

@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

2 个答案:

答案 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();

// ...
}