Criteria.java
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
public class Criteria<T> implements Specification<T> {
private List<Criterion> criterions = new ArrayList<>();
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
if (!criterions.isEmpty()) {
List<Predicate> predicates = new ArrayList<>();
for (Criterion c : criterions) {
predicates.add(c.toPredicate(root, query, builder));
}
// 将所有条件用 and 联合起来
if (predicates.size() > 0) {
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
}
}
return builder.conjunction();
}
/**
* 增加简单条件表达式
*
* @Methods Name add
* @Create In 2012-2-8 By lee
*/
public void add(Criterion criterion) {
if (criterion != null) {
criterions.add(criterion);
}
}
}
Criterion.java
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
public interface Criterion {
enum Operator {
EQ, NE, LIKE, GT, LT, GTE, LTE, AND, OR, IS_MEMBER, IS_NOT_MEMBER
}
Predicate toPredicate(Root<?> root, CriteriaQuery<?> query,
CriteriaBuilder builder);
}
Restrictions.java
import org.hibernate.criterion.MatchMode;
import org.springframework.util.StringUtils;
public class Restrictions {
/**
* 等于
*/
public static SimpleExpression eq(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.EQ);
}
/**
* 集合包含某个元素
*/
public static SimpleExpression hasMember(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.IS_MEMBER);
}
/**
* 不等于
*/
public static SimpleExpression ne(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.NE);
}
/**
* 模糊匹配
*/
public static SimpleExpression like(String fieldName, String value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.LIKE);
}
/**
* 模糊匹配
*/
public static SimpleExpression like(String fieldName, String value,
MatchMode matchMode, boolean ignoreNull) {
if (StringUtils.isEmpty(value)) return null;
return null;
}
/**
* 大于
*/
public static SimpleExpression gt(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.GT);
}
/**
* 小于
*/
public static SimpleExpression lt(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.LT);
}
/**
* 小于等于
*/
public static SimpleExpression lte(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.LTE);
}
/**
* 大于等于
*/
public static SimpleExpression gte(String fieldName, Object value, boolean ignoreNull) {
if (ignoreNull && StringUtils.isEmpty(value)) {
return null;
}
return new SimpleExpression(fieldName, value, Criterion.Operator.GTE);
}
}
SimpleExpression.java
import org.springframework.util.StringUtils;
import javax.persistence.criteria.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SimpleExpression implements Criterion {
/**
* 属性名
*/
private String fieldName;
/**
* 对应值
*/
private Object value;
/**
* 计算符
*/
private Operator operator;
// /**
// * 计算符
// */
// private String groupBy;
protected SimpleExpression(String fieldName, Object value, Operator operator) {
this.fieldName = fieldName;
this.value = value;
this.operator = operator;
}
// protected SimpleExpression(String fieldName, Object value, Operator operator,String groupBy) {
// this.fieldName = fieldName;
// this.value = value;
// this.operator = operator;
// this.groupBy = groupBy;
// }
@Override
@SuppressWarnings({"rawtypes", "unchecked"})
public Predicate toPredicate(Root<?> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
Path expression;
//此处是表关联数据,注意仅限一层关联,如user.address,
//查询user的address集合中,address的name为某个值
if (fieldName.contains(".")) {
String[] names = StringUtils.split(fieldName, ".");
//获取该属性的类型,Set?List?Map?
expression = root.get(names[0]);
Class clazz = expression.getJavaType();
if (clazz.equals(Set.class)) {
SetJoin setJoin = root.joinSet(names[0]);
expression = setJoin.get(names[1]);
} else if (clazz.equals(List.class)) {
ListJoin listJoin = root.joinList(names[0]);
expression = listJoin.get(names[1]);
} else if (clazz.equals(Map.class)) {
MapJoin mapJoin = root.joinMap(names[0]);
expression = mapJoin.get(names[1]);
} else {
//是many to one时
expression = expression.get(names[1]);
}
} else {
//单表查询
expression = root.get(fieldName);
}
// if(groupBy !=null){
// query.groupBy(root.get(groupBy));
// }
switch (operator) {
case EQ:
return builder.equal(expression, value);
case NE:
return builder.notEqual(expression, value);
case LIKE:
return builder.like((Expression<String>) expression, "%" + value + "%");
case LT:
return builder.lessThan(expression, (Comparable) value);
case GT:
return builder.greaterThan(expression, (Comparable) value);
case LTE:
return builder.lessThanOrEqualTo(expression, (Comparable) value);
case GTE:
return builder.greaterThanOrEqualTo(expression, (Comparable) value);
case IS_MEMBER:
return builder.isMember(value, expression);
case IS_NOT_MEMBER:
return builder.isNotMember(value, expression);
default:
return null;
}
}
}