springboot-data-jpa默认方法支持排序,当然复杂的场景需要自己重写默认的方法,下面介绍四种常用的排序方法
首先需要定义一个依赖的对象
@Data
public class Person{
private Integer id;
private String name;
private int sex;
private String address;
}
定义Repository
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
///方法的定义
}
-
自定义接口
如果我们只需要做简单查询,其中一个字段需要作为排序,则可以使用jpa支持自定义接口的办法即可
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
findByNameOrderByIdDesc(String name);
findByNameOrderByIdAsc(String name);
}
使用该方法的好处是业务逻辑代码简单,缺点是可扩展性不太好,支持升序或者降序操作,当一个接口需要同时支持升序或者降序时,则不适用。
- @query接口
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
@Query(" from Person WHERE name = ?1 ORDER BY id ?2")
List<Person> findInOrders(String name, String order);
}
使用该方法还是只能支持单个字段排序,优点是业务逻辑代码简单,另外比上一种更灵活,同时支持升序和降序排序。
- Sort方法
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
List<Person > findByname(String name, Sort sort)
}
使用该方法支持多个字段排序,优点是业务逻辑代码简单,代码看上去更优雅,同时支持升序和降序排序。缺点是所有字段必须同时支持同一种排序方式
除了上述三种方式外,还有支持复杂的查询及排序
-
接口重写
需要继承接口JpaSpecificationExecutor
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person> {
}
在服务实现类里面需要重写toPredicate方法
public class PersonServiceImpl{
PersonRepository repository;
findByCond(Condition cond){
repository.findAll(new Specification<Person>(){
PageRequest pageable = new PageRequest(cond.page, cond.size);
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//业务逻辑代码
}, pageable)
}
}
该方法最大的优势是可扩展性非常的高,可以添加多条件,同时支持多字段排序字段,每个字段的排序规则根据实际情况可以自由变化。
好了,先分享到这里