二 JPA 排序 條件查詢 分頁查詢

前一篇寫到了JPA接口中提供的save(),findAll(),findById(),count()等簡單的操做。這裏繼續補充稍微複雜一點,實用一點的排序 分頁 條件查詢的用法。
一樣也是不須要定義接口,直接調用的。3d

批量插入

方法:<S extends T> List<S> saveAll(Iterable<S> var1);
實例:code

@Test
    public void testSaveAll() {
        User user2 = new User();
        user2.setUserName("李四");
        user2.setAge(27);
        user2.setGender("男");

        User user3 = new User();
        user3.setUserName("王五");
        user3.setAge(25);
        user3.setGender("女");

        User user4 = new User();
        user4.setUserName("趙六");
        user4.setAge(26);
        user4.setGender("女");

        List<User> list = new ArrayList();
        list.add(user2);
        list.add(user3);
        list.add(user4);
        userRepository.saveAll(list);
        log.info("批量保存成功");
    }

說明:JPA提供的saveAll()方法是多個SQL在一個事物裏,而後一塊兒提交的,這個能從執行結果或者源碼中看到。
對象

排序

方法: List<T> findAll(Sort var1);
實例:blog

@Test
    public void testFindSort() {

        Sort ageSort = Sort.by("age");//根據年齡升序
        Sort ageSort1 = Sort.by(Sort.Direction.ASC, "age");//根據年齡升序
        Sort ageSort2 = Sort.by(Sort.Direction.DESC, "age");//根據年齡倒敘
        Sort ageSort3 = Sort.by(Sort.Direction.DESC, "age","name");//根據名字和年齡倒敘
        
        List<User> userListSortByAge = userRepository.findAll(ageSort);
        log.info("查詢全部按照age倒敘:{}", userListSortByAge);
    }

說明:JPA的排序是藉助 Sort 類實現的,Sort類有不少種辦法建立,官方給出的是經過 Sort.by(Sort.Direction direction, String... properties)實例化
其中第一個參數是排序策略,可省略,缺省升序(Sort.Direction.ASC),從第二個參數開始是排序的字段,能夠一個或多個。排序

條件查詢

方法: <S extends T> List<S> findAll(Example<S> var1);
實例:接口

@Test
    public void testFindByExample() {

        //等同條件查詢
        User user = new User();
        user.setGender("男");
        Example<User> userExample = Example.of(user);
        List<User> userExampleList = userRepository.findAll(userExample);
        log.info("性別爲男的用戶爲:{}", userExampleList);

        //等同條件查詢惟一記錄,若是查到兩條會報錯
        User user2 = new User();
        user2.setUserName("張三");
        Example<User> oneUserExample = Example.of(user2);
        Optional<User> oneUser = userRepository.findOne(oneUserExample);
        log.info("名字叫張三的記錄:{}", oneUser);
    }

說明:JPA的條件查詢是藉助 Example 類實現的,Example經過 Example.of(T probe)實例化,參數是條件實體。條件都是等值條件,
好比name = '張三' ,age = '23' ,若是須要 age > '23' 或者 like(模糊匹配),in, not in ,is null 等條件的查詢,Example 不夠用,須要藉助更詳細的
查詢條件類 Predicate 實現,這個放到下一篇在寫。get

分頁查詢

方法: Page<T> findAll(Pageable var1);
實例:源碼

@Test
    public void testFindByPage() {
        //分頁查詢  jpa頁碼是從0開始的,傳入1的話,返回的是第二頁的數據
        PageRequest pageParam = PageRequest.of(1, 2);
        Page<User> userListByPage = userRepository.findAll(pageParam);
        long totalElements = userListByPage.getTotalElements();
        int totalPages = userListByPage.getTotalPages();
        List<User> content = userListByPage.getContent();
        log.info("分頁查詢結果,總記錄數:{},總頁數:{},選定頁數據:{}", totalElements, totalPages, content);
    }

說明:分頁查詢藉助PageRequest實現,PageRequest經過PageRequest.of(int page, int size)實例化,參數是頁數和每頁行數,
注意JPA的page是從0開始算的,page傳0,查詢的是第1頁的數據,分頁查詢的返回結果是個 Page 對象,包換總頁數,總行數,查詢頁內容信息。it

相關文章
相關標籤/搜索