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
相关产品推荐
相关产品推荐

