背景
- 在使用Spring Data Jpa中的Specification進行多條件查詢時的各種條件處理
實例
- 以下實例中的查詢條件包括(等於;大於;小於;in;not in;between)
Specification<MinerExceptionTable> specification = new Specification<MinerExceptionTable>() { @SneakyThrows @Override public Predicate toPredicate(Root<MinerExceptionTable> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> predicateList = new ArrayList<>(); /** * 相等=== * * @參數 X * @參數類型 */ if (StrUtil.isNotEmpty()) { predicateList.add(criteriaBuilder.equal(root.get("farmCode"), X)); } /** * not in * * @參數 XXXX * @參數類型 List */ if (CollUtil.isNotEmpty(XXXX)) { Predicate validDnaPredicate = root.get("dna").in(XXXX).not(); predicateList.add(validDnaPredicate); } /** * in * * @參數 XXXX * @參數類型 List */ if (CollUtil.isNotEmpty(XXXX)) { Predicate invalidDna = root.get("dna").in(XXXX); predicateList.add(invalidDna); } /** * 大於等於>= * * @參數 XX * @參數類型 數值 */ if (CollUtil.isNotEmpty(XX)) { predicateList.add(criteriaBuilder.greaterThanOrEqualTo(root.get("level"), XX)); } /** * 小於等於<= * * @參數 XX * @參數類型 數值 */ if (CollUtil.isNotEmpty(XX)) { predicateList.add(criteriaBuilder.lessThanOrEqualTo(root.get("level"), XX)); } /** * betweeen * * @參數 XX_1 ; XX_2 * @參數類型 數值 */ if (CollUtil.isNotEmpty(XXX_1) && CollUtil.isNotEmpty(XXX_2)) { predicateList.add(criteriaBuilder.between(root.get("level"), XX_1, XX_2)); } /** * 大於等於>= * * @參數 XXX * @參數類型 Date */ if (CollUtil.isNotEmpty(XXX)) { predicateList.add(criteriaBuilder.greaterThanOrEqualTo(root.get("level").as(Date.class), XX)); } /** * 小於等於<= * * @參數 XXX * @參數類型 Date */ if (CollUtil.isNotEmpty(XXX)) { predicateList.add(criteriaBuilder.lessThanOrEqualTo(root.get("level").as(Date.class), XX)); } /** * betweeen * * @參數 XXX_1 ; XXX_2 * @參數類型 Date */ if (CollUtil.isNotEmpty(XXX_1) && CollUtil.isNotEmpty(XXX_2)) { predicateList.add(criteriaBuilder.between(root.get("level").as(Date.class), XX_1, XX_2)); } Predicate[] pre = new Predicate[predicateList.size()]; pre = predicateList.toArray(pre); return criteriaQuery.where(pre).getRestriction(); } };