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
}`
我有两个关于 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
}`