mirror of https://github.com/elunez/eladmin
130 lines
5.2 KiB
Java
130 lines
5.2 KiB
Java
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 <R, Q> Predicate getPredicate(Root<R> root, Q query, CriteriaBuilder cb) {
|
|
List<Predicate> list = new ArrayList<>();
|
|
|
|
if(query == null){
|
|
return cb.and(list.toArray(new Predicate[list.size()]));
|
|
}
|
|
try {
|
|
List<Field> 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<? extends Comparable>) fieldType),val));
|
|
break;
|
|
case GREATER_THAN:
|
|
list.add(cb.greaterThanOrEqualTo(getExpression(attributeName,join,root)
|
|
.as((Class<? extends Comparable>) fieldType), (Comparable) val));
|
|
break;
|
|
case LESS_THAN:
|
|
list.add(cb.lessThanOrEqualTo(getExpression(attributeName,join,root)
|
|
.as((Class<? extends Comparable>) fieldType), (Comparable) val));
|
|
break;
|
|
case LESS_THAN_NQ:
|
|
list.add(cb.lessThan(getExpression(attributeName,join,root)
|
|
.as((Class<? extends Comparable>) 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<Long>)val)) {
|
|
list.add(getExpression(attributeName,join,root).in((Collection<Long>) 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 <T, R> Expression<T> getExpression(String attributeName, Join join, Root<R> 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<Field> getAllFields(Class clazz, List<Field> fields) {
|
|
if (clazz != null) {
|
|
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
|
|
getAllFields(clazz.getSuperclass(), fields);
|
|
}
|
|
return fields;
|
|
}
|
|
}
|