日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringBoot:整合JPA-Specifications動態查詢:

作者:不隨意的風 更新時間: 2022-09-05 編程語言

????????有時我們在查詢某個實體的時候,給定的條件是不固定的,這時就需要動態構建相應的查詢語句,在Spring Data JPA中可以通過JpaSpecificationExecutor接口查詢。相比JPQL,其優勢是類型安全,更加的面向對象。

JpaSpecificationExecutor接口的方法有:


    Optional<T> findOne(@Nullable Specification<T> spec);

    List<T> findAll(@Nullable Specification<T> spec);

    Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);

    List<T> findAll(@Nullable Specification<T> spec, Sort sort);

    long count(@Nullable Specification<T> spec);

    boolean exists(Specification<T> spec);

核心參數是?Specification接口 可以采用內部類的方式或lambda表達式來創建。

自定義查詢條件
? ? ? ? ? ? 1.實現Specification接口(提供泛型:查詢的對象類型)
? ? ? ? ? ? ? 2.實現toPredicate方法構造查詢條件)
? ? ? ? ?? ? ? 3.需要借助方法參數中的兩個參數(
? ? ? ? ?? ? ? ? ?root:獲取需要查詢的對象屬性
? ? ? ? ?? ? ? ? ?CriteriaBuilder:構造查詢條件的,內部封裝了很多的查詢條件(模糊匹配,精準匹配))

1. Optional<T> findOne(@Nullable Specification<T> spec); 條件查詢

@SpringBootTest
public class Tes4 {
    @Autowired
    private CustomerDao dao;

    @Test //one
    public void show1(){
        Specification<Customer> sp = (Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder cb)->{
            Path<Object> custName = root.get("custName");
            Predicate predicate = cb.equal(custName, "小王");
            return predicate;

        };
        Optional<Customer> one = dao.findOne(sp);
        System.out.println(one);

    }

2.List<T> findAll(@Nullable Specification<T> spec);

@Test //多條件查詢
    public void show2(){
        Specification<Customer> sp = ( root,  query, cb)->{
            Path<Object> custName = root.get("custName");
            Path<Object> custAddress = root.get("custAddress");

            Predicate p1 = cb.equal(custName, "小王");
            Predicate p2 = cb.equal(custAddress, "吉祥村");
            Predicate predicate = cb.or(p1, p2);
            return predicate;
        };
        dao.findAll(sp).stream().forEach(System.out::println);

    }

3.模糊查詢

 @Test //模糊
    public void show3(){
        Specification<Customer> sp = ( root,  query, cb)->{
            Path<Object> custName = root.get("custName");


            Predicate predicate   = cb.like(custName.as(String.class), "%老%");


            return predicate;
        };
        dao.findAll(sp).stream().forEach(System.out::println);

    }

4.? ?List<T> findAll(@Nullable Specification<T> spec, Sort sort);

 @Test //排序
    public void show4(){
        Specification<Customer> sp = ( root,  query, cb)->{
            Path<Object> custName = root.get("custName");


            Predicate predicate   = cb.like(custName.as(String.class), "%老%");


            return predicate;
        };
        Sort sort = Sort.by(Sort.Direction.DESC, "custId");
        dao.findAll(sp,sort).stream().forEach(System.out::println);

    }

5.? ? Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);

@Test //分頁
    public void show5(){
        Specification<Customer> sp = ( root,  query, cb)->{
            Path<Object> custName = root.get("custName");


            Predicate predicate   = cb.like(custName.as(String.class), "%老%");


            return null;
        };
        PageRequest page = PageRequest.of(1, 2);
        Page<Customer> list = dao.findAll(sp, page);
        list.getContent().stream().forEach(System.out::println);//查詢結果
        System.out.println(list.getTotalElements()+"總數");
        System.out.println(list.getTotalPages()+"總頁數");

    }


? ? ? ? ?

原文鏈接:https://blog.csdn.net/weixin_71419462/article/details/126128497

欄目分類
最近更新