PredicatesBuilder.java 5.19 KB
package com.bsth.entity.search;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 
 * @ClassName: PredicatesBuilder 
 * @author PanZhao 
 * @date 2016年3月16日 下午4:05:07 
 *
 */
public class PredicatesBuilder {

	/**
	 * Number转换器
	 */
	private static NumberFormat nf;
	
	static{
		nf = NumberFormat.getInstance();
	}
	
	public static Predicate eq(CriteriaBuilder cb,Path<?> expression, Object object){
		return cb.equal(expression, object);
	}
	
	public static Predicate ne(CriteriaBuilder cb,Path<?> expression, Object object){
		return cb.notEqual(expression, object);
	}
	
	public static Predicate gt(CriteriaBuilder cb,Path<Number> expression, Object object){
		try {
			return cb.gt(expression, nf.parse(object.toString()));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static Predicate ge(CriteriaBuilder cb,Path<?> expression, Object object){
        Class<?> leftType = expression.getJavaType();
        Class<?> rightType = object.getClass();

        if (leftType.isAssignableFrom(Number.class) &&
                rightType.isAssignableFrom(Number.class)) { // 判定是否是Number类型的子类
            return cb.ge((Path<Number>) expression, (Number) object);
        } else if (leftType.isAssignableFrom(String.class) &&
                rightType.isAssignableFrom(String.class)) { // 判定是否是String类型的子类
            return cb.greaterThanOrEqualTo((Path<String>) expression, (String) object);
        } else if (leftType.isAssignableFrom(Date.class) &&
                rightType.isAssignableFrom(Date.class)) { // 判定是否是Date类型的子类
            return cb.greaterThanOrEqualTo((Path<Date>) expression, (Date) object);
        } else {
            throw new RuntimeException("ge 不支持类型组合:" + expression.getJavaType() + ">=" + object.getClass());
        }
	}
	
	public static Predicate lt(CriteriaBuilder cb,Path<Number> expression, Object object){
		try {
			return cb.lt(expression, nf.parse(object.toString()));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static Predicate le(CriteriaBuilder cb,Path<?> expression, Object object){
        Class<?> leftType = expression.getJavaType();
        Class<?> rightType = object.getClass();

        if (leftType.isAssignableFrom(Number.class) &&
                rightType.isAssignableFrom(Number.class)) { // 判定是否是Number类型的子类
            return cb.le((Path<Number>) expression, (Number) object);
        } else if (leftType.isAssignableFrom(String.class) &&
                rightType.isAssignableFrom(String.class)) { // 判定是否是String类型的子类
            return cb.lessThanOrEqualTo((Path<String>) expression, (String) object);
        } else if (leftType.isAssignableFrom(Date.class) &&
                rightType.isAssignableFrom(Date.class)) { // 判定是否是Date类型的子类
            return cb.lessThanOrEqualTo((Path<Date>) expression, (Date) object);
        } else {
            throw new RuntimeException("ge 不支持类型组合:" + expression.getJavaType() + ">=" + object.getClass());
        }
	}
	
	public static Predicate prefixLike(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.like(expression,  object.toString() + "%");
	}
	
	public static Predicate prefixNotLike(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.notLike(expression,  object.toString() + "%");
	}
	
	public static Predicate suffixLike(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.like(expression,  "%" + object.toString());
	}
	
	public static Predicate suffixNotLike(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.notLike(expression,  "%" + object.toString());
	}
	
	public static Predicate like(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.like(expression,  "%" + object.toString() + "%");
	}
	
	public static Predicate notLike(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.notLike(expression,  "%" + object.toString() + "%");
	}
	
	public static Predicate isNull(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.isNull(expression);
	}
	
	public static Predicate isNotNull(CriteriaBuilder cb,Path<String> expression, Object object){
		return cb.isNotNull(expression);
	}
	
	public static Predicate isf(CriteriaBuilder cb,Path<Boolean> expression, Object object){
		return cb.isFalse(expression);
	}
	
	public static Predicate ist(CriteriaBuilder cb,Path<Boolean> expression, Object object){
		return cb.isTrue(expression);
	}
	
	public static Predicate date(CriteriaBuilder cb,Path<?> expression, Object object){
		Date time = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			time = sdf.parse(object.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cb.equal(expression, time);
	}
}