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