Spring Data Jpa 在Springboot中,排序不适用于Pageable

46qrfjad  于 2024-01-09  发布在  Spring
关注(0)|答案(2)|浏览(270)

我试图通过在Springboot中使用Pageable实现分页和排序,JPARepository。不知何故排序不起作用。我在下面包括我的代码,其中我有控制器,服务类,存储库,实体等。我还发布了我的控制台输出,你可以看到只有限制被追加,但不是“排序依据”到SQL查询。我不知道我在这里错过了什么,因为我已经按照Spring.io中记录的所有内容进行分页和排序。

TestController:

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. @Autowired
  5. private TestService testService;
  6. @GetMapping("/list/{fileId}")
  7. public Page<Test> list(@PathVariable Integer fileId, @RequestParam Map<String, String> queryMap) throws Exception {
  8. return testService.getTestList(fileId, queryMap);
  9. }
  10. }

字符串

TestEntity:

  1. public class Test implements Serializable {
  2. private static final long serialVersionUID = 1L;
  3. @Id
  4. @NotNull
  5. @Column(name = "id")
  6. private Integer id;
  7. @Column(name = "fileId")
  8. private Integer fileId;
  9. @Column(name = "fname")
  10. private String fname;
  11. @Column(name = "lname")
  12. private String lname;
  13. @Column(name = "email")
  14. private String email;
  15. @Column(name = "address")
  16. private String address;
  17. public Test() {
  18. }
  19. public Test(Integer id) {
  20. this.id = id;
  21. }
  22. public Integer getId() {
  23. return id;
  24. }
  25. public void setId(Integer id) {
  26. this.id = id;
  27. }
  28. public Integer getFileId() {
  29. return fileId;
  30. }
  31. public void setFileId(Integer fileId) {
  32. this.fileId = fileId;
  33. }
  34. public String getFname() {
  35. return fname;
  36. }
  37. public void setFname(String fname) {
  38. this.fname = fname;
  39. }
  40. public String getLname() {
  41. return lname;
  42. }
  43. public void setLname(String lname) {
  44. this.lname = lname;
  45. }
  46. public String getEmail() {
  47. return email;
  48. }
  49. public void setEmail(String email) {
  50. this.email = email;
  51. }
  52. public String getAddress() {
  53. return address;
  54. }
  55. public void setAddress(String address) {
  56. this.address = address;
  57. }
  58. }

TestRepository:

  1. public interface TestRepo extends JpaRepository<Test, Integer> {
  2. Page<Test> findByFileId(@Param("fileId") int fileId, Pageable pageable);
  3. }

TestService:

  1. @Service
  2. public class TestService {
  3. @Autowired
  4. private TestRepo testRepo;
  5. public Page<Test> getTestList(Integer fileId, Map<String, String> queryMap) {
  6. Sort sort = Sort.by(Direction.valueOf(queryMap.get("direction")), queryMap.get("property"));
  7. Pageable pageable = PageRequest.of(Integer.parseInt(queryMap.get("pageNo")) - 1,
  8. Integer.parseInt(queryMap.get("pageSize")), sort);
  9. Page<Test> testDetails = testRepo.findById(id, pageable);
  10. return testDetails;
  11. }
  12. }

获取请求:

  1. http://localhost:8080/cms/test/list/0?pageNo=1&pageSize=5&direction=DESC&property=fname

控制台输出:

正如我们在控制台输出中看到的,即使sort对象被传递到JPARepository查询,在sql查询中也没有追加orderby。

  1. [nio-8080-exec-3] org.hibernate.SQL : select test0_.id as id1_21_, test0_.address as address2_21_, test0_.email as email3_21_, test0_.fname as fname4_21_, test0_.lname as lname5_21_ from test test0_ where test0_.fileId=? limit ?
  2. [nio-8080-exec-3] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [0]

7y4bm7vi

7y4bm7vi1#

在您的Repository上扩展PagingAndSortingRepository如下:

  1. public interface TestRepo extends PagingAndSortingRepository<Test, Integer> {
  2. // ...
  3. }

字符串

ki0zmccv

ki0zmccv2#

我在尝试分页和排序命名查询时也遇到了同样的问题
在我的例子中,只有分页一个命名查询才能工作,分页+排序不行。
所以我直接在命名查询中添加了排序,因为排序列不是动态的,而分页来自我的@Service

  1. Pageable pageable = PageRequest.of(page, perPage);
  2. Page<Customer> pageCustomer = prospectRepository.findAllNotDeletedSortByName(pageable);

字符串
我的orm.xml中的命名查询:

  1. <named-query name="Prospect.findAllNotDeletedSortByDenomAzienda">
  2. <query>
  3. <![CDATA[SELECT cr
  4. FROM Customer cr
  5. WHERE cr.deleted = false
  6. ORDER BY cr.name ASC ]]>
  7. </query>
  8. </named-query>

展开查看全部

相关问题