jpa自動化參數查詢

package com.wangge.buzmgt.customtask.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang.StringUtils;

public class PredicateUtil {
  
  private final static String DATE_FORMAT = "yyyy-MM-dd hh:mm:ss SSS";
  private final static String YEAR_MONTH_DAY = "yyyy-MM-dd";
  private final static String TIME_MIN = " 00:00:00 000";
  
  private final static String TIME_MAX = " 23:59:59 999";
  
  private final static String TYPE_DATE = "java.util.Date";
  
  /**
   * predicate的通用處理方法
   * 
   * @param params
   * @param root
   * @param cb
   * @param predicates
   * @throws NumberFormatException
   */
  @SuppressWarnings("unchecked")
  public static void createPedicateByMap(Map<String, Object> params, Root<?> root, CriteriaBuilder cb,
      List<Predicate> predicates) throws NumberFormatException {
    // key 爲 columnName_operation ,value爲值
    for (Map.Entry<String, Object> search : params.entrySet()) {
      String keyAndFilter = search.getKey();
      Object value = search.getValue();
      if (!keyAndFilter.contains("_")) {
        continue;
      }
      String key = keyAndFilter.split("_")[1];
      String filter = keyAndFilter.split("_")[0];
      Path expression = root.get(key);
      if (null == value || StringUtils.isBlank(value.toString())) {
        continue;
      }
      Class<?> clssz = expression.getJavaType();
      String javaTypeName = clssz.getName();
      try {
        switch (filter) {
          case "EQ":
            if (javaTypeName.equals(TYPE_DATE)) {
              predicates.add(cb.equal(root.get(key), new SimpleDateFormat(YEAR_MONTH_DAY).parse(value.toString())));
            } else {
              // 若是是枚舉類型,則轉化爲枚舉實例
              if (clssz.isEnum()) {
                Object[] enums = clssz.getEnumConstants();
                predicates.add(cb.equal(root.get(key), enums[Integer.valueOf(value + "")]));
              } else {
                predicates.add(cb.equal(root.get(key), value));
              }
            }
            break;
          case "LK":
            if (!value.toString().equals("")) {
              predicates.add(cb.like(root.get(key), "%" + value + "%"));
            }
            break;
          case "GT":
            if (javaTypeName.equals(TYPE_DATE)) {
              // 大於最大值
              predicates.add(
                  cb.greaterThan(expression, new SimpleDateFormat(DATE_FORMAT).parse(value.toString() + TIME_MIN)));
              
            } else {
              predicates.add(cb.greaterThan(expression, (Comparable) value));
            }
            
            break;
          case "LT":
            if (javaTypeName.equals(TYPE_DATE)) {
              try {
                // 小於最小值
                predicates
                    .add(cb.lessThan(expression, new SimpleDateFormat(DATE_FORMAT).parse(value.toString() + TIME_MAX)));
              } catch (ParseException e) {
                throw new RuntimeException("日期格式化失敗!");
              }
            } else {
              predicates.add(cb.lessThan(expression, (Comparable) value));
            }
            
            break;
          case "ORE":
            /**
             * 查詢HedgeVo 一個值查兩個字段 'sc_ORE_shopName = orderNo_A37010506130
             */
            String[] parameter = ((String) value).split("_");
            Path<?> expression_ = root.get(parameter[0]);
            String value_ = parameter[1];
            Predicate p = cb.or(cb.equal(expression_, value_), cb.like(expression, "%" + value_ + "%"));
            predicates.add(p);
            
            break;
          case "ORLK":
            /**
             * 只支持字符串適配 sc_ORLK_userId-region = A37010506130
             */
            String[] keys = keyAndFilter.split("-");
            List<Predicate> orList = new ArrayList<>();
            for (int i = 0; i < keys.length; i++) {
              orList.add(cb.like(root.get(keys[i]), "%" + value + "%"));
            }
            Predicate p_LK = cb.or(orList.toArray(new Predicate[] {}));
            predicates.add(p_LK);
            
            break;
        }
      } catch (ParseException e) {
        throw new RuntimeException("日期格式化失敗!");
      }
    }
  }
}
相關文章
相關標籤/搜索