簡體   English   中英

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 Integer” 的錯誤。

我該如何避免這個問題?

第二JPQL @Query可以返回一個實例嗎? 請參考第二個代碼。

現在,方法insertInto(String name, String mail)返回 int 值:受影響的列數。 但是,我想將受影響的列本身作為返回值。 我可以這樣做嗎? 或者,我應該在服務 class 的方法中添加另一個代碼來實現 function 嗎?

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

你遇到的第一個錯誤是 controller 的{id}/sample/insert/相同,我想因為你之前有/sample/{id}/ ,他可以將/sample/insert/匹配到第一個 controller。不確定您是否在這兩種方法之間進行了交換,但我認為它不會同樣有效。 由於您對 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) ,我相信你可以做你想做的,但首先,你需要知道什么是列類型。 然后切換方法以返回類型而不是 int。

如果您可以添加有關第二個問題的更多說明,我將編輯答案以添加更多詳細信息。

問題一:在此輸入圖片描述

他們的請求 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
}`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM