SpringDataJPA -06- specification的基本使用

29 篇文章 3 订阅

目录


specification的使用

 Specification是一个函数式接口,需要实现toPredicate(Root root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder)方法

  • root:查询的根对象(查询的任何属性都可以从根对象中获取)
  • CriteriaQuery:顶层查询对象,自定义查询方式(了解:一般不用)
  • CriteriaBuilder:查询的构造器,封装了很多的查询条件

单参数查询

@Test
public void testSpecificationOneParam(){
    Specification<Customer> specification=(root,query,cb)->{
        //获取比较属性
        Path<Object> custName = root.get("custName");
        //构建查询条件
        Predicate predicate = cb.equal(custName, "飞飞飞");
        return predicate;
    };
    List<Customer> customers = this.customerRepository.findAll(specification);
    customers.forEach((customer -> System.out.println(customer)));
}

多参数查询

@Test
public void testSpecificationMoreParam(){
    Specification<Customer> specification=(root, query, criteriaBuilder) -> {
        //获取比较属性
        Path<Object> custName = root.get("custName");
        Path<Object> custIndustry = root.get("custIndustry");

        //构造条件查询
        Predicate preName = criteriaBuilder.equal(custName, "飞飞飞");
        Predicate preIndy = criteriaBuilder.equal(custIndustry, "娱乐");

        //与相连
        Predicate predicate = criteriaBuilder.and(preName, preIndy);
        return predicate;
    };
    List<Customer> customers = this.customerRepository.findAll(specification);
    customers.forEach((customer)-> System.out.println(customer));
}

模糊查询

@Test
public void testSpecificationLike(){
    Specification<Customer> specification=(root, query, criteriaBuilder) -> {
        //获取比较属性
        Path<Object> custName = root.get("custName");

        //构建查询条件
        Predicate predicate = criteriaBuilder.like(custName.as(String.class), "%飞__");
        return predicate;
    };
    List<Customer> customers = this.customerRepository.findAll(specification);
    customers.forEach(customer -> System.out.println(customer));
}

分页查询

@Test
public void testSpecificationPage(){
    //每页数目
    int row=5;
    //当前页
    int page=0;

    //添加查询条件
    Specification<Customer> specification=(root, query, criteriaBuilder) -> {
        //获取比较属性
        Path<Object> custName = root.get("custName");

        //构建查询条件
        Predicate predicate = criteriaBuilder.like(custName.as(String.class), "%飞__");
        return predicate;
    };

    //排序
    //        Sort sort=Sort.by(Sort.Direction.ASC,"custId");
    //分页条件
    Pageable pageable=PageRequest.of(page,row,Sort.Direction.ASC,"custId");

    //分页查询
    Page<Customer> cpage = this.customerRepository.findAll(pageable);

    //获取数据集合
    List<Customer> customers = cpage.getContent();
    //获取总页数
    int totalPages = cpage.getTotalPages();
    //获取总条数
    long totalElements = cpage.getTotalElements();

    System.out.println("数据总页数:"+totalPages);
    System.out.println("数据总条数:"+totalElements);
    customers.forEach(customer -> System.out.println(customer));

}

输出


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值