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

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

banche168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值