刚接触 SpringBoot 不久,想请教 V 友们一个问题:
@Entity
public class Task {
// Other fields...
@CreatedBy
@ManyToOne
@JoinColumn(name = "created_by", referencedColumnName = "id")
private Integer createdBy;
}
@Entity
public class User {
private Integer id;
private String nickname;
// Don't want to show only in Task
private String email;
// ...
}
实体 Task 多对一关联了实体 User ,除了添加@JsonIgnore
的方式,如何让 Task 作为 ResponseBody 序列化时忽略 User 中的某些字段?
不想使用@JsonIgnore
注解的原因是还想在其他的接口中返回 User 的全部字段,还望 V 友们不吝赐教。
1
wenbinwu 2023-02-26 16:06:36 +08:00 1
弄两个 User class?
|
2
ginakira OP @wenbinwu 正常通过 Repository 查询部分字段可以用 Projection 解决,但这种在关联字段里的就不知道怎么弄了……如果用两个 User class 的话该如何映射到真正的 User 表呢
|
3
arjen 2023-02-26 16:22:18 +08:00 1
SQL 写 JOIN ,然后弄个 DTO 对象
|
4
thinkershare 2023-02-26 16:24:38 +08:00 1
本来就不应该将你的实体暴露给最终用户,肯定是给不同的接口按照不同使用需求添加 Dto 哈。
然后找个 Mapper 实现自动映射,如果有必要甚至可用上 GraphQL 或者其它 BFF 层。 在高级一点,将查询和命令分离,上 CQRS. |
5
lybcyd 2023-02-26 18:10:25 +08:00 via Android 1
根据你的需要,额外定义 DTO ,只包含你想返回的字段,然后把查询出来的数据拼装进去,而不是直接返回实体类。
|
6
ginakira OP @thinkershare @lybcyd 感谢
|
7
mmdsun 2023-02-26 21:08:55 +08:00 2
"不想使用 @JsonIgnore 注解的原因是还想在其他的接口中返回 User 的全部字段"
这个需求你可以用 @JsonView ,把这个注解加到字段上 @JsonView(SimpleView.class) private String username; @JsonView(DetailView.class) private String password; SimpleView 、DetailView.class 其实就是一个空接口,可有有继承的关系。 比如 intreface DetailView extends SimpleView {} 然后再你控制器上加上你这个接口, 这样你可以精确控制 哪些接口显示哪些字段了 @GetMapping @JsonView(UserProfile.PublicView.class) |