天天看点

springboot-data-jpa常用排序方法汇总

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

该方法最大的优势是可扩展性非常的高,可以添加多条件,同时支持多字段排序字段,每个字段的排序规则根据实际情况可以自由变化。

好了,先分享到这里

继续阅读