You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate/JSON查询场景下如何仅获取关联子类的指定属性?

实现方案

有多种注解组合可以实现目标返回结构,以下是最常用的三种方案:

方案1:使用Jackson序列化注解(适配默认使用Jackson的Spring Boot等场景)

直接修改实体类的序列化规则,步骤如下:

  1. 在Owner类不需要返回的id、name字段上添加@JsonIgnore注解,屏蔽该字段序列化
  2. 在Owner类的company关联字段上添加@JsonUnwrapped注解,将Company的字段平铺到Owner的序列化层级
  3. 在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自定义视图(不影响其他接口的序列化规则)

如果不想修改实体默认的序列化逻辑避免影响其他业务接口,可以自定义序列化视图:

  1. 定义视图分组类
public class CarView {
    public interface Simple {}
}
  1. 在需要返回的字段上标注对应视图
// 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;
  1. 在查询接口上标注使用该视图
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:57:03