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 { /** * @描述 : 转换为Predicate * @作者 : Dong ZhaoYang * @日期 : 2017/8/7 * @时间 : 17:25 */ @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[list.size()])); } 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 attributeName = isBlank(propName) ? field.getName() : propName; Class fieldType = field.getType(); Object val = field.get(query); if (ObjectUtil.isNull(val)) { continue; } Join join = null; if (ObjectUtil.isNotEmpty(joinName)) { switch (q.join()) { case LEFT: join = root.join(joinName, JoinType.LEFT); break; case RIGHT: join = root.join(joinName, 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); } return cb.and(list.toArray(new Predicate[list.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); } @SuppressWarnings("unchecked") public 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)) == false) { return false; } } return true; } @SuppressWarnings("unchecked") private static List getAllFields(Class clazz, List fields) { if (clazz != null) { fields.addAll(Arrays.asList(clazz.getDeclaredFields())); getAllFields(clazz.getSuperclass(), fields); } return fields; } }