在PagingAndSortingRepository的.findAll(Pagination分页)方法中对两个串联字段进行排序

时间:2019-03-28 20:00:24

标签: java spring spring-boot spring-data-jpa

我有一个api端点/ user,它返回User实体的排序和分页结果。我的示例似乎运行良好,我可以使用/ user?sort = name,desc之类的参数对结果进行排序。

我的问题是此默认排序仅适用于简单属性,例如String,int,long,...。我现在尝试实现的是某种自定义排序,例如按枚举排序(必须翻译)或某些组合字段(名称与姓氏串联)。

是否有可能做到这一点?

控制器

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowird
    private UserRepository userRepository;

    @GetMapping("") public ResponseEntity getAll(Pageable pageable) {
        return ResponseEntity.ok(userRepository.findAll(pageable));
    }
}

UserRepository

@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
}

实体

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "surname")
    private String surname;
}

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您希望按一个字段进行排序,并且如果有类似的值(例如surname),那么您希望它们按另一个字段进行排序,例如{{1} }。

这可以通过将一个由字段名和nameAsc关键字组成的存储库方法串联起来来完成:

Desc

如果您想使用findAllOrderBySurnameAscNameAsc处理排序parameters dynamically,则Sort class of Spring Data是您要查找的类。

根据您的enum的设计,您现在可以像这样组装enum

Pageable

…并将其传递给您的Pageable sortedBySurnameAndName = PageRequest.of(0, 10, Sort.by("surname").asending().and(Sort.by("name"))); 方法。