工作中小结:(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;
}
};
}
加油!