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
。
我就是这样做的:
- 你的数据class没问题,没有什么需要注意的
- 用于扩展
JpaRepository
的接口不适合您的 @RequestParam
。尝试这样做:
@Repository
public interface VirusRepository extends JpaRepository<Virus, Long> {
List<Virus> findByRiskContainingIgnoreCase(String risk);
}
- 然后创建一个
interface
来映射您的所有方法:
public interface VirusService {
List<Virus> findByrisk(String risk);
}
- 创建服务实现 class 以实现所有服务方法:
@Service
public class VirusServiceImpl implements VirusService {
@Autowired
private VirusRepository repository;
@Override
public List<Virus> findByRisk(String risk) {
return repository.findByRiskContainingIgnoreCase(risk);
}
}
- 您创建将接受您的请求的
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);
}
}
- 向您提出要求
localhost:8080/risk/findByRisk
应该没问题。
我想在 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
。
我就是这样做的:
- 你的数据class没问题,没有什么需要注意的
- 用于扩展
JpaRepository
的接口不适合您的@RequestParam
。尝试这样做:
@Repository public interface VirusRepository extends JpaRepository<Virus, Long> { List<Virus> findByRiskContainingIgnoreCase(String risk); }
- 然后创建一个
interface
来映射您的所有方法:
public interface VirusService { List<Virus> findByrisk(String risk); }
- 创建服务实现 class 以实现所有服务方法:
@Service public class VirusServiceImpl implements VirusService { @Autowired private VirusRepository repository; @Override public List<Virus> findByRisk(String risk) { return repository.findByRiskContainingIgnoreCase(risk); } }
- 您创建将接受您的请求的
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); } }
- 向您提出要求
localhost:8080/risk/findByRisk
应该没问题。