JPA组装查询条件

查询示例

    public Page queryList(StudentVO studentVO){int page = 1;int size = 20;// 创建Pageable对象,页数从0开始查询PageRequest pageRequest = PageRequest.of(page-1, size);// 拉姆达表达式Specification userSpecification = (root, query, criteriaBuilder)->buildQueryParam(studentVO, root, criteriaBuilder);Page all = studentDao.findAll(userSpecification, pageRequest);return all;}

查询的方法:

   private Predicate buildQueryParam(StudentVO studentVO, Root root, CriteriaBuilder criteriaBuilder){List list = new ArrayList<>();// 拼条件if(studentVO.getAge() != null){list.add(criteriaBuilder.equal(root.get("age"), studentVO.getAge()));}// 转换为Predicate[]Predicate[] predicates = list.toArray(new Predicate[]{});return criteriaBuilder.and(predicates);}

相关的Dao:

@Repository
public interface StudentDao extends JpaRepository, JpaSpecificationExecutor {
}

注意

方法入参可以交换位置

    Specification userSpecification = (root, query, criteriaBuilder)->buildQueryParam(root, criteriaBuilder, studentVO);

查询的方法:

   private Predicate buildQueryParam(Root root, CriteriaBuilder criteriaBuilder, StudentVO studentVO){}

简单查询

在这里插入图片描述

判断条件

演示数据
在这里插入图片描述

INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811a', '张三', 18, 0, '2022-11-24 16:14:34');
INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811b', '李四', 23, 1, '2022-11-24 16:53:02');
INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811c', '王五一', 19, 0, '2022-12-13 11:10:38');
INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811d', '赵六一', 19, 1, '2022-11-29 11:11:00');
INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811e', '刘七', 20, 0, '2022-12-07 11:11:32');
INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811f', '孙子', NULL, 1, '2022-12-01 11:12:27');
INSERT INTO `jpa_study`.`student`(`id`, `name`, `age`, `gender`, `create_time`) VALUES ('a90bcd22f811g', '周一一', NULL, 1, '2022-12-05 11:15:00');

等于

需求:获取age等于19的所有数据

        // 等于if(studentVO.getAge() != null){list.add(criteriaBuilder.equal(root.get("age"), studentVO.getAge()));}

结果:
在这里插入图片描述

不等于

需求:获取age不等于19的所有数据

        // 不等于,注意不等于只在有数据的记录内判断,如果字段为null,这不是不等于if(studentVO.getAge() != null){list.add(criteriaBuilder.notEqual(root.get("age"), studentVO.getAge()));}

结果:
在这里插入图片描述

之所以没有“孙子、周一一”,是因为这两条数据的age为null,null不是不等于19。
注意 不等于某个具体数值时不计算null,即如果字段为null,该记录不是不等于某个具体数值。

大于

需求:获取age大于19的所有数据

        if(studentVO.getAge() != null){list.add(criteriaBuilder.greaterThan(root.get("age"), studentVO.getAge()));}

结果:
在这里插入图片描述

注意 null同样不计算在内

between

需求:获取年龄在19,20之间的所有数据,包括19和20

        if(studentVO.getAge() != null){list.add(criteriaBuilder.between(root.get("age"), studentVO.getAge(),20));}

结果:
在这里插入图片描述

注意 between是全闭区间,包括头尾数据。

like

需求:name模糊查询“一”

        if(studentVO.getName() != null){list.add(criteriaBuilder.like(root.get("name"),"%"+studentVO.getName()+"%"));}

结果:
在这里插入图片描述

in

需求:name in(“张三”、“李四”)

        if(studentVO.getName() != null){CriteriaBuilder.In inNames = criteriaBuilder.in(root.get("name"));List nameList = new ArrayList<>();nameList.add("张三");nameList.add("李四");for (String s : nameList) {inNames.value(s);}list.add(inNames);}
 

结果:
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章