Spring 数据 JPA:如何使用 @PathVariable 和 JPQL

Spring Data JPA : How to use @PathVariable and JPQL

我有两个关于 Spring Data JPA 的问题。

1st:如何避免@PathVariable误将url的一部分识别为参数?

第一个是关于这道题的代码。 当我尝试访问“/sample/insert/”时,url 被处理为“/sample/{id}/”,我收到类似“String 'insert' cannot convert to整数".

如何避免这个问题?

2nd: 可以JPQL @Query return实例吗? 请参考第二个代码。

目前,方法insertInto(String name, String mail) returns int 值:受影响的列数。但是,我想将受影响的列本身作为 return 值。我可以这样做吗?或者,我是否应该在服务中的方法中添加另一个代码来实现该功能?class?

@RestController
public class SampleController{
    
    @Autowired
    SampleService sampleService;
    
    @RequestMapping
    public String index(Model model){
       //omitted
    }
    
    @GetMapping("/sample/")
    public String getAllSample(Model model){
       //omitted
    }
    
    @GetMapping("/sample/{id}/")
    public String getSampleById(@PathVariable("id") Integer id, Model model){
        System.out.println("===================");
        System.out.println(">> accessed: /sample/{id} ");
        System.out.println("===================");
        return sampleService.getById(id).toString();
    }

    @RequestMapping("/sample/insert/")
    public int insert(Model model){
        System.out.println("===================");
        System.out.println(">> accessed: /sample/insert/ ");
        System.out.println("===================");
        return sampleService.create("NewName", "mail@mail.com");
    }
@Transactional
@Repository
public interface SampleRepository extends JpaRepository<Sample, Integer>{
    
    @Query("SELECT s FROM Sample s ")
    public List<Sample> showAll();
    
    @Query("SELECT s FROM Sample s WHERE id = :id")
    public Sample searchById(@Param("id") Integer id);
    
    @Modifying
    @Query(value = "INSERT INTO sample (name, mail) VALUES (?1, ?2)", nativeQuery = true)
    public int insertInto(@Param("name") String name, @Param("mail") String mail);
    
}

您遇到的第一个错误是 {id}/sample/insert/ 相同的控制器,我想是因为您之前有 /sample/{id}/,他可以匹配 /sample/insert/到第一个控制器。 不确定您是否在这两种方法之间进行了交换,但我认为它不会同样有效。由于您对应该使用哪种方法感到困惑spring。



    @RequestMapping("/sample/insert/")
    public int insert(Model model){
        System.out.println("===================");
        System.out.println(">> accessed: /sample/insert/ ");
        System.out.println("===================");
        return sampleService.create("NewName", "mail@mail.com");
    }

    @GetMapping("/sample/{id}/")
    public String getSampleById(@PathVariable("id") Integer id, Model model){
        System.out.println("===================");
        System.out.println(">> accessed: /sample/{id} ");
        System.out.println("===================");
        return sampleService.getById(id).toString();
    }

你可以做些什么来避免这种情况,更改为 /sample/get/{id} 肯定会解决这个问题。

    @GetMapping("/sample/{id}/")
    public String getSampleById(@PathVariable("id") Integer id, Model model){
        System.out.println("===================");
        System.out.println(">> accessed: /sample/{id} ");
        System.out.println("===================");
        return sampleService.getById(id).toString();
    }

    @RequestMapping("/sample/insert/")
    public int insert(Model model){
        System.out.println("===================");
        System.out.println(">> accessed: /sample/insert/ ");
        System.out.println("===================");
        return sampleService.create("NewName", "mail@mail.com");
    }

对于insertInto(String name, String mail),我相信你可以为所欲为,但首先,你需要知道什么是列类型。然后将方法切换为 return 类型而不是 int.

如果您可以对第二个问题进行更多说明,我将编辑答案以添加更多详细信息。

问题一: enter image description here

他们的请求url相同,请求方法都是GET 解决方案 1:将第二个请求方法更改为 POST 解决方案 2:更改他们的请求 url,像这样 /smaple/{id}/info

question 2: SampleRepository extends JpaRepository. JpaRepository defined many methods, include save method. you can code in sampleService
`@AutoWired
 SampleRepository sampleRepository;
 public Sample insert(String name, String email){
     Sample sample = new Sample();
     sample.setName(name);
     sample.setEmail(email);
     int result = this.sampleRepository.save(sample);
     if (result > 0){
       return sample;
     }
    //error
}`