HIBERNATE:disjunction和conjunction构造复杂的查询条件.

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

加油!

猜你喜欢

转载自blog.csdn.net/zhangleiyes123/article/details/83095603
今日推荐