package me.zhengjie.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import me.zhengjie.annotation.Query; import javax.persistence.criteria.*; import java.lang.reflect.Field; import java.util.*; /** * @author Zheng Jie * @date 2019-6-4 14:59:48 */ @Slf4j public class QueryHelp { @SuppressWarnings("unchecked") public static Predicate getPredicate(Root root, Q query, CriteriaBuilder cb) { List list = new ArrayList<>(); if(query == null){ return cb.and(list.toArray(new Predicate[0])); } try { List fields = getAllFields(query.getClass(), new ArrayList<>()); for (Field field : fields) { boolean accessible = field.isAccessible(); field.setAccessible(true); Query q = field.getAnnotation(Query.class); if (q != null) { String propName = q.propName(); String joinName = q.joinName(); String blurry = q.blurry(); String attributeName = isBlank(propName) ? field.getName() : propName; Class fieldType = field.getType(); Object val = field.get(query); if (ObjectUtil.isNull(val) || "".equals(val)) { continue; } Join join = null; // 模糊多字段 if (ObjectUtil.isNotEmpty(blurry)) { String[] blurrys = blurry.split(","); List orPredicate = new ArrayList<>(); for (String s : blurrys) { orPredicate.add(cb.like(root.get(s) .as(String.class), "%" + val.toString() + "%")); } Predicate[] p = new Predicate[orPredicate.size()]; list.add(cb.or(orPredicate.toArray(p))); continue; } if (ObjectUtil.isNotEmpty(joinName)) { String[] joinNames = joinName.split(">"); for (String name : joinNames) { switch (q.join()) { case LEFT: if(ObjectUtil.isNotNull(join)){ join = join.join(name, JoinType.LEFT); } else { join = root.join(name, JoinType.LEFT); } break; case RIGHT: if(ObjectUtil.isNotNull(join)){ join = join.join(name, JoinType.RIGHT); } else { join = root.join(name, JoinType.RIGHT); } break; } } } switch (q.type()) { case EQUAL: list.add(cb.equal(getExpression(attributeName,join,root) .as((Class) fieldType),val)); break; case GREATER_THAN: list.add(cb.greaterThanOrEqualTo(getExpression(attributeName,join,root) .as((Class) fieldType), (Comparable) val)); break; case LESS_THAN: list.add(cb.lessThanOrEqualTo(getExpression(attributeName,join,root) .as((Class) fieldType), (Comparable) val)); break; case LESS_THAN_NQ: list.add(cb.lessThan(getExpression(attributeName,join,root) .as((Class) fieldType), (Comparable) val)); break; case INNER_LIKE: list.add(cb.like(getExpression(attributeName,join,root) .as(String.class), "%" + val.toString() + "%")); break; case LEFT_LIKE: list.add(cb.like(getExpression(attributeName,join,root) .as(String.class), "%" + val.toString())); break; case RIGHT_LIKE: list.add(cb.like(getExpression(attributeName,join,root) .as(String.class), val.toString() + "%")); case IN: if (CollUtil.isNotEmpty((Collection)val)) { list.add(getExpression(attributeName,join,root).in((Collection) val)); } break; } } field.setAccessible(accessible); } } catch (Exception e) { log.error(e.getMessage(), e); } int size = list.size(); return cb.and(list.toArray(new Predicate[size])); } @SuppressWarnings("unchecked") private static Expression getExpression(String attributeName, Join join, Root root) { if (ObjectUtil.isNotEmpty(join)) { return join.get(attributeName); } else { return root.get(attributeName); } } private static boolean isBlank(final CharSequence cs) { int strLen; if (cs == null || (strLen = cs.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if (!Character.isWhitespace(cs.charAt(i))) { return false; } } return true; } private static List getAllFields(Class clazz, List fields) { if (clazz != null) { fields.addAll(Arrays.asList(clazz.getDeclaredFields())); getAllFields(clazz.getSuperclass(), fields); } return fields; } }