1. 程式人生 > >springdatajpa進階動態sql

springdatajpa進階動態sql

springdatajpa高階應用

1.specifications的動態查詢方法概述

T findOne(Specification<T> spec);  //查詢單個物件

List<T> findAll(Specification<T> spec);  //查詢列表

//查詢全部,分頁
//pageable:分頁引數
//返回值:分頁pageBean(page:是springdatajpa提供的)
Page<T> findAll(Specification<T> spec, Pageable pageable);

//查詢列表
//Sort:排序引數
List<T> findAll(Specification<T> spec, Sort sort); long count(Specification<T> spec);//統計查詢 *Specification :查詢條件

####2.環境配置–略,同入門小呆萌

###3.單條件查詢:條件存在,新增條件,條件不存在,查詢所有

 /**
     * 1.單條件查詢,-->動態查詢,如果該欄位的條件存在,則新增該條件,如果該條件不存在,查詢所有
     */
    @Test
    public void test01(){
        //定義查詢條件
final String address = "beijing"; Specification<Customer> spec = new Specification<Customer>() { public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) { Predicate beijing = null; //1.findOne原本只提供主鍵查詢,要想依據其他屬性進行查詢,必須使用的Spec的高階查詢
//對條件進行判斷 if (address!=null && !"".equals(address)){ //1.1按 custAddress 屬性進行查詢,該名稱必須是實體類的成員變數---獲取成員變數 Path<Object> custAddress = root.get("custAddress"); //引數必須與實體類成員變數一致 //1.2構建查詢條件, 引數1:Path屬性物件,引數2:匹配的條件 beijing = cb.equal(custAddress, address); } return beijing; } }; List<Customer> customerList = customerDao.findAll(spec); for (Customer customer : customerList) { System.out.println(customer); } }

4.多條件查詢

 /**
     * 2.多條件查詢:條件存在則加入條件,條件不存在則,不加入,條件這件使用連線符:如and ,or,...
     * 對於非equals查詢,如模糊查詢:like,查詢的欄位必須宣告欄位型別
     */
    @Test
    public void test02() {
        //方法傳入的條件
        final String addressStr = "你從哪裡來";
        final String nameStr = "%j%";

        Specification<Customer> spec = new Specification<Customer>() {
            public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                //獲取查詢物件屬性
                Path<Object> custName = root.get("custName");
                Path<Object> custAddress = root.get("custAddress");
                //構建查詢條件
                Predicate custNameSpec = null;
                if (nameStr != null && !"".equals(nameStr)) {
                    custNameSpec = criteriaBuilder.equal(custName, "你從哪裡來");
                }
                Predicate custAddressSpec = null;
                if (addressStr != null && !"".equals(addressStr)) {
                    //注:如果不是equals,必須申明屬性的資料型別
                    custAddressSpec = criteriaBuilder.like(custAddress.as(String.class), "%j%");
                }
                //連線符,and並且的關係
                Predicate and = criteriaBuilder.and(custNameSpec, custAddressSpec);
                return and;
            }
        };
        Customer one = customerDao.findOne(spec);
        System.out.println("one = " + one);
    }

5.分頁查詢

  /**
     * 分頁查詢:維護分頁物件
     */
    @Test
    public void test03() {
        //分頁物件  ,引數1:頁碼開始從0開始,引數2:每頁的大小
        Pageable page = new PageRequest(1,2);
        Page<Customer> all = customerDao.findAll(page);
        //獲取每頁內容
        List<Customer> content = all.getContent();
        for (Customer customer : content) {
            System.out.println(customer);
        }
        //獲取總記錄數
        long totalElements = all.getTotalElements();
        System.out.println("totalElements = " + totalElements);
        //獲取總頁數
        int totalPages = all.getTotalPages();
        System.out.println("totalPages = " + totalPages);
    }

6.排序查詢

  /**
     * 排序查詢:維護,排序物件
     */
    @Test
    public void test04() {
        //引數1:排序方式,升或者降,引數2:排序欄位屬性
        Sort sort = new Sort(Sort.Direction.DESC,"custName");
        List<Customer> all = customerDao.findAll(sort);
        for (Customer customer : all) {
            System.out.println("customer = " + customer);
        }

    }