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

Spring Boot Data JPA findByRisk查询MySQL表REST接口无返回问题

Spring Boot JPA 按risk字段查询Virus表无返回问题解决

问题背景

需要在Java Spring Boot JPA项目中根据Virus表的risk字段(MySQL enum类型)查询匹配的病毒数据。

相关代码定义

1. Repository 定义

public interface VirusRepository extends JpaRepository<Virus, Long> {
    List<Virus> findByRisk(@RequestParam("risk") String risk);
}

2. Virus 实体类定义

@Entity
@Table(name = "virus")
@Data
public class Virus {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "mortality_rate")
    private float mortality_rate;

    @Column(name = "risk")
    private String risk;

    @Column(name = "year")
    private int year;

    @ManyToOne
    @JoinColumn(name = "treatment_id", nullable = false)
    private Treatment treatment;
}

3. 关联Treatment实体类定义

@Entity
@Table(name = "treatment")
@Data
public class Treatment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "treatment")
    private Set<Virus> viruses;
}

问题现象

访问地址http://localhost:9999/api/viruses/?risk=high时无法返回预期数据,最初怀疑是MySQL中risk字段为enum类型导致类型不匹配。

根因与解决方案

该问题和MySQL enum字段无关,是Spring Data REST的端点路径规则问题:自定义的Repository查询方法默认暴露在/[资源根路径]/search/[方法名]端点下,根路径直接加参数不会触发自定义查询逻辑。
正确访问路径为:
http://localhost:9999/api/viruses/search/findByRisk?risk=high
访问该路径即可得到正确响应。

额外优化建议

  • Repository的查询方法上不需要加@RequestParam注解,该注解是Controller层接收参数用的,Spring Data JPA会自动匹配方法参数和查询条件,优化后写法如下:
public interface VirusRepository extends JpaRepository<Virus, Long> {
    List<Virus> findByRisk(String risk);
}
  • 如果要更规范的使用枚举类型,可以定义对应的Risk枚举类,在实体类的risk字段上加@Enumerated(EnumType.STRING)注解,JPA会自动完成MySQL enum类型和Java枚举的映射,无需手动用String接收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:08