Spring-引导数据 JPA findByField 在 MySQL table REST 上不起作用

Spring-Boot Data JPA findByField does not work on MySQL table REST

我想在 Java Spring Boot JPA 中查询我的病毒中枚举类型的风险参数 table:

public interface VirusRepository extends JpaRepository<Virus, Long> {

    List<Virus> findByRisk(@RequestParam("risk") String risk);
}

这是我的病毒class:

@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;
}

我的治疗table:(病毒有fk-key治疗id)

@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;
}

但是,当我输入 url: http://localhost:9999/api/viruses/?risk=high

时,我没有得到返回的所需数据

为什么?可能是因为我在 MySQL Table 病毒实体上定义了枚举类型的风险?:

**编辑:我自己发现了,我忘了 link 是:

http://localhost:9999/api/viruses/search/findByRisk?risk=high

然后我得到正确的回复。**

我不知道你使用的是什么逻辑,但根据我个人的经验,我从未见过 sombedy 将 @RequestParam 放入 Repository interface
我就是这样做的:

  1. 你的数据class没问题,没有什么需要注意的
  2. 用于扩展 JpaRepository 的接口不适合您的 @RequestParam。尝试这样做:
@Repository    
public interface VirusRepository extends JpaRepository<Virus, Long> {  
    List<Virus> findByRiskContainingIgnoreCase(String risk);    
}
  1. 然后创建一个 interface 来映射您的所有方法:
public interface VirusService {
    List<Virus> findByrisk(String risk);    
}
  1. 创建服务实现 class 以实现所有服务方法:
@Service
public class VirusServiceImpl implements VirusService {    
    
    @Autowired
    private VirusRepository repository;   

    @Override
    public List<Virus> findByRisk(String risk) {   
        return repository.findByRiskContainingIgnoreCase(risk);   
    }    
}
  1. 您创建将接受您的请求的 controller
@RestController    
@RequestMapping("/virus/")    
public class VirusController {    
     
     @Autowired
     private VirusService service;    

     @GetMapping("/findByRisk")
     public List<Virus> findByRisk(@RequestParam("risk") String risk) {    
         return service.findByRisk(risk);   
     }    
}
  1. 向您提出要求localhost:8080/risk/findByRisk应该没问题。