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

调用PunkAPI获取啤酒数据如何提取指定字段并配置Entity实体关联

实体类关联关系配置

结合返回的JSON结构,4个实体类的单向关联关系配置如下:

  • Beer 类和 Method 类:一对一关联,用@OneToOne注解,配置级联保存为CascadeType.ALL,查询抓取策略设为FetchType.EAGER即可,Beer实体中存储Method的外键关联
  • Method 类和 MashTemp 类:一对多关联,用@OneToMany注解,同样配置级联全操作和立即抓取,MashTemp表中存储关联Method的外键
  • MashTemp 类和 Temp 类:一对一关联,用@OneToOne注解,配置同上,MashTemp表中存储关联Temp的外键

所有实体类统一添加@JsonIgnoreProperties(ignoreUnknown = true)注解,避免API返回的多余字段导致反序列化报错,不需要的字段无需在实体类中定义即可自动忽略。

指定返回字段的实现方案

有两种常用方案可选,按需使用即可:

方案1:实体类加JSON序列化注解(适合简单场景)

在不需要返回的字段上添加@JsonIgnore注解,同时自定义mash_temp的序列化逻辑,将嵌套在method下的mash_temp提升到Beer的同级返回,示例代码如下:

// Beer类示例
@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Beer {
    @Id
    private Long id;
    private String name;
    private String description;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JsonIgnore // 序列化时隐藏method层级
    private Method method;

    // 序列化时直接输出mash_temp字段
    @JsonProperty("mash_temp")
    public List<MashTemp> getMashTemp() {
        return method != null ? method.getMashTemp() : null;
    }
}

// Method类示例
@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Method {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JsonProperty("mash_temp")
    private List<MashTemp> mashTemp;
    // 不需要的fermentation、twist字段无需定义
}

// MashTemp类示例
@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class MashTemp {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Temp temp;
    private Integer duration;
}

// Temp类示例
@Data
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Temp {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Integer value;
    private String unit;
}

配置完成后原有Service代码无需修改,接口直接返回Beer实体即可仅输出指定的4个字段。

方案2:自定义DTO类(适合复杂场景,解耦性更好)

单独定义返回给前端的BeerDTO类,仅包含需要返回的4个字段:

@Data
public class BeerDTO {
    private Long id;
    private String name;
    private String description;
    private List<MashTemp> mashTemp;
}

查询到Beer实体后,手动或借助Bean映射工具将对应属性拷贝到BeerDTO后返回即可,实体类和接口返回结构完全解耦,互不影响。


内容的提问来源于stack exchange,提问作者Filip Vidojevic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:15:05