HIBERNATE:disjunction和conjunction構造複雜的查詢條件.
阿新 • • 發佈:2018-11-10
工作中小結:(1)
查詢某個批次的資料,也還可以輸入州/縣/醫療機構(這三個是或者的關係);//disjunction或者
關係:【 批次的資料 && (州 || 縣 || 醫療機構)】 關係(用下面方法一:)
(2).還有一種情況:是下拉框可以選擇條件查詢,可以選擇多個條件進行查詢(這種是並且的關係);//conjunction並且
關係: 【批次的資料 && 州 && 縣 && 醫療機構 】 關係 (用下面方法二:)
情況不同,用到的方法也不一樣,下面是兩種情況的方法附上:
方法一:用到disjunction或者 有&&有||
@SuppressWarnings("serial") public static <T> Specification<T> findSpecification(Map<String, Object> searchParams, final Class<T> clazz) { return new Specification<T>() { @SuppressWarnings("unchecked") @Override public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate p = cb.conjunction();//並且 Predicate d = cb.disjunction();//或者 for (Entry<String, Object> entry : searchParams.entrySet()) { String[] key = entry.getKey().split("_"); if("P".equals(key[0])) { if ("EQ".equals(key[1])) { p.getExpressions().add(cb.equal(root.<String>get(key[2]), entry.getValue().toString().trim())); } if ("NOTEQ".equals(key[1])) { // p.getExpressions().add(cb.equal(root.<String>get(key[2]), entry.getValue().toString().trim())); p.getExpressions().add(cb.notEqual(root.<String>get(key[2]), entry.getValue().toString().trim())); } if ("LIKE".equals(key[1])) { p.getExpressions().add(cb.like(root.<String>get(key[2]), "%" + entry.getValue().toString().trim() + "%")); } if("IN".equals(key[1])) { p.getExpressions().add(cb.and(root.get(key[2]).in((List<Integer>)entry.getValue()))); } if ("EGT".equals(key[1])) { p.getExpressions().add(cb.greaterThanOrEqualTo(root.<String>get(key[2]), entry.getValue().toString().trim())); } if ("EIT".equals(key[1])) { p.getExpressions().add(cb.lessThanOrEqualTo(root.<String>get(key[2]), entry.getValue().toString().trim())); } }else if("D".equals(key[0])) { if ("EQ".equals(key[1])) { d.getExpressions().add(cb.equal(root.<String>get(key[2]), entry.getValue().toString().trim())); } if ("LIKE".equals(key[1])) { d.getExpressions().add(cb.like(root.<String>get(key[2]), "%" + entry.getValue().toString().trim() + "%")); } } } //如果 disjunction 不為空 if(!d.getExpressions().isEmpty()) { p.getExpressions().add(d); } return p; } }; }
方法二:是conjunction並且 純&&關係
@SuppressWarnings("serial") public static <T> Specification<T> getSpecification(Map<String, Object> searchParams, final Class<T> clazz) { return new Specification<T>() { @SuppressWarnings("unchecked") @Override public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate predicate = cb.conjunction();//並且 for (Entry<String, Object> entry : searchParams.entrySet()) { String[] key = entry.getKey().split("_"); if ("EQ".equals(key[0])) { predicate.getExpressions().add(cb.equal(root.<String>get(key[1]), entry.getValue().toString().trim())); } if ("LIKE".equals(key[0])) { predicate.getExpressions().add(cb.like(root.<String>get(key[1]), "%" + entry.getValue().toString().trim() + "%")); } if ("NOTEQ".equals(key[0])) { predicate.getExpressions().add(cb.notEqual(root.<String>get(key[1]), entry.getValue().toString().trim())); } if ("EGT".equals(key[0])) { predicate.getExpressions().add(cb.greaterThanOrEqualTo(root.<String>get(key[1]), entry.getValue().toString().trim())); } if ("EIT".equals(key[0])) { predicate.getExpressions().add(cb.lessThanOrEqualTo(root.<String>get(key[1]), entry.getValue().toString().trim())); } if ("IN4".equals(key[0])) { predicate.getExpressions().add(cb.and(root.get(key[1]).in((List<Integer>)entry.getValue()))); } } return predicate; } }; }
加油!