1. 程式人生 > >HIBERNATE:disjunction和conjunction構造複雜的查詢條件.

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;
			}
		};
	}

加油!