二 JPA 排序 条件查询 分页查询

前一篇写到了JPA接口中提供的save(),findAll(),findById(),count()等简单的操作。这里继续补充稍微复杂一点,实用一点的排序 分页 条件查询的用法。
同样也是不需要定义接口,直接调用的。

批量插入

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

    @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);
实例:

    @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 实现,这个放到下一篇在写。

分页查询

方法: 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 对象,包换总页数,总行数,查询页内容信息。

posted @ 2019-01-31 12:30  Zhuhj  阅读(6883)  评论(0编辑  收藏  举报