Hibernate/JSON查询场景下如何仅获取关联子类的指定属性?
实现方案
有多种注解组合可以实现目标返回结构,以下是最常用的三种方案:
方案1:使用Jackson序列化注解(适配默认使用Jackson的Spring Boot等场景)
直接修改实体类的序列化规则,步骤如下:
- 在
Owner类不需要返回的id、name字段上添加@JsonIgnore注解,屏蔽该字段序列化 - 在
Owner类的company关联字段上添加@JsonUnwrapped注解,将Company的字段平铺到Owner的序列化层级 - 在
Company类不需要返回的id字段上添加@JsonIgnore注解
示例代码:
// Owner类修改示例 ... @JsonIgnore private Long id; @JsonIgnore private String name; ... @OneToOne @JsonUnwrapped protected Company company;
// Company类修改示例 ... @JsonIgnore private int id; private String mainBrand; ...
修改后序列化得到的结果就是你需要的结构。
方案2:使用@JsonView自定义视图(不影响其他接口的序列化规则)
如果不想修改实体默认的序列化逻辑避免影响其他业务接口,可以自定义序列化视图:
- 定义视图分组类
public class CarView { public interface Simple {} }
- 在需要返回的字段上标注对应视图
// Car类 @JsonView(CarView.Simple.class) private String licensePlate; @JsonView(CarView.Simple.class) protected Owner owner; // Owner类 @JsonView(CarView.Simple.class) @JsonUnwrapped protected Company company; // Company类 @JsonView(CarView.Simple.class) private String mainBrand;
- 在查询接口上标注使用该视图
@GetMapping("/car/{id}") @JsonView(CarView.Simple.class) public Car getCar(@PathVariable Long id) { return carRepository.findById(id).orElseThrow(); }
方案3:Spring Data JPA投影(无需修改序列化注解,查询时直接映射结构)
如果用Spring Data JPA做持久层,可以直接定义投影接口,查询时返回对应类型即可:
// 投影接口定义 public interface CarProjection { String getLicensePlate(); OwnerProjection getOwner(); interface OwnerProjection { String getMainBrand(); } }
// Repository查询方法 public interface CarRepository extends JpaRepository<Car, Long> { Optional<CarProjection> findCarById(Long id); }
如果使用Fastjson等其他序列化框架,对应有@JSONField(serialize = false)等等效注解,逻辑和Jackson方案一致。
内容的提问来源于stack exchange,提问作者troubadour
相关产品推荐
相关产品推荐

