PredicatesBuilder.java 8.87 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.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 
 * @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(Date.class.isAssignableFrom(leftType) &&
				String.class.isAssignableFrom(rightType)){
			DateTime dateTime = new DateTime(object);
			return cb.equal(expression, dateTime.toDate());
		}
		else {
			return cb.equal(expression, object);
		}

        /*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 (Boolean.class.isAssignableFrom(leftType) &&
                Boolean.class.isAssignableFrom(rightType)) {
            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 in(CriteriaBuilder cb,Path<?> expression, Object object){
		String[] obj=object.toString().split(",");
		List<String> list=new ArrayList<String>();
		for(int i=0;i<obj.length;i++){
			list.add(obj[i]);
		}
		return cb.in(expression).value(list);
	}
	
	
	public static Predicate ins(CriteriaBuilder cb,Path<?> expression, List<String> list){
		return cb.in(expression).value(list);
	}
	
	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 if (long.class.isAssignableFrom(leftType) &&
				String.class.isAssignableFrom(rightType)) { // Long >= String
			return cb.greaterThanOrEqualTo((Path<Long>) expression, Long.valueOf(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 (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 if (long.class.isAssignableFrom(leftType) &&
				String.class.isAssignableFrom(rightType)) { // Long <= String
			return cb.lessThanOrEqualTo((Path<Long>) expression, Long.valueOf(object + "") );
		} 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);
	}

	public static Predicate dateEq(CriteriaBuilder cb,Path<?> expression, Object object){
		Predicate predicate = null;
		try {
			DateTime dateTime = new DateTime(object);
			Date startTime = dateTime.toDate();//设置起始时间
			Calendar c = Calendar.getInstance();
			c.setTime(startTime);
			c.add(Calendar.DAY_OF_MONTH, 1);
			// 设置结束时间,起始时间为结束时间加1天
			Date endTime = c.getTime();
			predicate = cb.between((Path<Date>) expression,startTime,endTime);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return predicate;
	}
}