Spring-Boot MVC JPA 过滤器
Spring-Boot MVC JPA Filters
首先让我说我是 Spring Boot 的新手,如果我在某个地方犯了一个愚蠢的错误,我们深表歉意。我正在尝试使用 @RequestParam 检索我的表单 post 的值,以便我可以在 JPA 查询中使用它来查询 return 具有特定宠物类型的孩子。我已经完成了其他 JPA 查询并获得了成功的结果,但是从填充的 select 中获取 Enum 值以便我可以将它传递回控制器查询让我感到难过。
我一直收到错误消息:
方法参数类型字符串所需的请求参数'p'不存在
我需要将 petType 传递给 Post 方法 findByPet_PetTypeEquals 以检索哪些孩子拥有该特定宠物类型。我只是不知道如何将该表单数据传递回控制器。
小孩class:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
@OneToOne
@JoinTable(name="KID_PET", joinColumns=@JoinColumn(name="KID_ID"),
inverseJoinColumns=@JoinColumn(name="PET_ID"))
private Pet pet;
宠物class:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private Boolean furry;
@Enumerated(EnumType.STRING)
private PetType petType;
PetType 枚举:
public enum PetType {
DOG, CAT, FISH, BIRD, HAMSTER;
}
相关控制器方法:
private KidRepository kidRepo;
@GetMapping("/")
public String index(Model model) {
model.addAttribute("kid", new Kid());
model.addAttribute("petType", PetType.values());
return "index";
}
@PostMapping("/findByPet_PetTypeEquals")
public String findByPet_PetTypeEquals(Model model, @RequestParam String p) {
List<Kid> kidList = kidRepo.findByPet_PetTypeEquals(p);
model.addAttribute("kidList", kidList);
return "displayKid";
}
表格:
<form method="post" th:action="findByPet_PetTypeEquals">
Pet Type: <select th:field="*{petType}">
<option th:each="p : ${petType}" th:value="${p}" th:text="${p}"></option>
</select>
<button type="submit">Submit</button>
</form>
回购:
public interface KidRepository extends JpaRepository<Kid, Long>{
public List<Kid> findByAgeGreaterThan(Integer age); // DONE
public List<Kid> findByPetNotNull(); // DONE
public List<Kid> findByPet_PetTypeEquals(String p); // NOT DONE
public List<Kid> findByPet_FurryIsTrue(); // DONE
}
非常感谢任何建议或指导!谢谢。
作为 findByPet_PetTypeEquals 中的方法参数,给出 Enum 而不是 String。
@Enumerated 只是一个注释,它允许 JPA/hibernate 将枚举作为字符串存储在数据库中,同时检索将字符串转换为枚举。所以,在你的方法参数中,它应该是 enum type
首先让我说我是 Spring Boot 的新手,如果我在某个地方犯了一个愚蠢的错误,我们深表歉意。我正在尝试使用 @RequestParam 检索我的表单 post 的值,以便我可以在 JPA 查询中使用它来查询 return 具有特定宠物类型的孩子。我已经完成了其他 JPA 查询并获得了成功的结果,但是从填充的 select 中获取 Enum 值以便我可以将它传递回控制器查询让我感到难过。
我一直收到错误消息:
方法参数类型字符串所需的请求参数'p'不存在
我需要将 petType 传递给 Post 方法 findByPet_PetTypeEquals 以检索哪些孩子拥有该特定宠物类型。我只是不知道如何将该表单数据传递回控制器。
小孩class:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
@OneToOne
@JoinTable(name="KID_PET", joinColumns=@JoinColumn(name="KID_ID"),
inverseJoinColumns=@JoinColumn(name="PET_ID"))
private Pet pet;
宠物class:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private Boolean furry;
@Enumerated(EnumType.STRING)
private PetType petType;
PetType 枚举:
public enum PetType {
DOG, CAT, FISH, BIRD, HAMSTER;
}
相关控制器方法:
private KidRepository kidRepo;
@GetMapping("/")
public String index(Model model) {
model.addAttribute("kid", new Kid());
model.addAttribute("petType", PetType.values());
return "index";
}
@PostMapping("/findByPet_PetTypeEquals")
public String findByPet_PetTypeEquals(Model model, @RequestParam String p) {
List<Kid> kidList = kidRepo.findByPet_PetTypeEquals(p);
model.addAttribute("kidList", kidList);
return "displayKid";
}
表格:
<form method="post" th:action="findByPet_PetTypeEquals">
Pet Type: <select th:field="*{petType}">
<option th:each="p : ${petType}" th:value="${p}" th:text="${p}"></option>
</select>
<button type="submit">Submit</button>
</form>
回购:
public interface KidRepository extends JpaRepository<Kid, Long>{
public List<Kid> findByAgeGreaterThan(Integer age); // DONE
public List<Kid> findByPetNotNull(); // DONE
public List<Kid> findByPet_PetTypeEquals(String p); // NOT DONE
public List<Kid> findByPet_FurryIsTrue(); // DONE
}
非常感谢任何建议或指导!谢谢。
作为 findByPet_PetTypeEquals 中的方法参数,给出 Enum 而不是 String。
@Enumerated 只是一个注释,它允许 JPA/hibernate 将枚举作为字符串存储在数据库中,同时检索将字符串转换为枚举。所以,在你的方法参数中,它应该是 enum type