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

import org.joda.time.DateTime;

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){
        Class<?> leftType = expression.getJavaType();
        Class<?> rightType = object.getClass();

        if (Number.class.isAssignableFrom(leftType) &&
                (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number == Number/String
            return cb.equal(expression, object);
        } else if (String.class.isAssignableFrom(leftType) &&
                (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String == String/Number
            return cb.equal(expression, object);
        } else if (Date.class.isAssignableFrom(leftType) &&
                Date.class.isAssignableFrom(rightType)) { // Date == Date
            return cb.equal(expression, object);
        } else if (Date.class.isAssignableFrom(leftType) &&
                String.class.isAssignableFrom(rightType)) { // Date == String
            DateTime dateTime = new DateTime(object);
            return cb.equal(expression, dateTime.toDate());
        } else {
            throw new RuntimeException("eq 不支持类型组合:" + expression.getJavaType() + "==" + object.getClass());
        }

	}
	
	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 (Number.class.isAssignableFrom(leftType) &&
                (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number >= Number/String
            return cb.ge((Path<Number>) expression, (Number) object);
        } else if (String.class.isAssignableFrom(leftType) &&
                (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String >= String/Number
            return cb.greaterThanOrEqualTo((Path<String>) expression, (String) object);
        } else if (Date.class.isAssignableFrom(leftType) &&
                Date.class.isAssignableFrom(rightType)) { // Date >= Date
            return cb.greaterThanOrEqualTo((Path<Date>) expression, (Date) object);
        } else if (Date.class.isAssignableFrom(leftType) &&
                String.class.isAssignableFrom(rightType)) { // Date >= String
            DateTime dateTime = new DateTime(object);
            return cb.greaterThanOrEqualTo((Path<Date>) expression, dateTime.toDate());
        } 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 (Number.class.isAssignableFrom(leftType) &&
                (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number <= Number/String
            return cb.le((Path<Number>) expression, (Number) object);
        } else if (String.class.isAssignableFrom(leftType) &&
                (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String <= String/Number
            return cb.lessThanOrEqualTo((Path<String>) expression, (String) object);
        } else if (Date.class.isAssignableFrom(leftType) &&
                Date.class.isAssignableFrom(rightType)) { // Date <= Date
            return cb.lessThanOrEqualTo((Path<Date>) expression, (Date) object);
        } else if (Date.class.isAssignableFrom(leftType) &&
                String.class.isAssignableFrom(rightType)) { // Date <= String
            DateTime dateTime = new DateTime(object);
            return cb.lessThanOrEqualTo((Path<Date>) expression, dateTime.toDate());
        } else {
            throw new RuntimeException("le 不支持类型组合:" + 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);
	}
}