项目中Hibernate中Criteria和Query查询和模式引用


在项目中Hibernate中Criteria和Query查询,总是缺少不了一些列的判断等,无论数据类型是什么,这些是必须的,最终动态添加的也是的获取Criteria和Query组成的hql,于是公司兄弟将Criteria和Query进行了抽出封装,采用设计模式中Builder的模式将组成hql过程的判断进行封装组合,使大家在使用时减少了判断是否为空或者空字符串等,细细的相信其实这也是设计模式的一部分好处吧!

封装类如下:

  1. public class DynamicQuery {  
  2.   
  3.     private StringBuilder hql = new StringBuilder();  
  4.   
  5.     public List<String> parameterNames = new ArrayList<String>();  
  6.   
  7.     public List<Object> parameterValues = new ArrayList<Object>();  
  8.   
  9.     public List<String> getParameterNames() {  
  10.         return parameterNames;  
  11.     }  
  12.   
  13.     public List<Object> getParameterValues() {  
  14.         return parameterValues;  
  15.     }  
  16.   
  17.     public DynamicQuery(String hql) {  
  18.         this.hql.append(hql);  
  19.     }  
  20.   
  21.     public DynamicQuery append(String hql) {  
  22.         return append(hql, (String[]) null, (String[]) null);  
  23.     }  
  24.      
  25.     public DynamicQuery appendIfTrue(String hql, boolean condition) {  
  26.      if (condition) {  
  27.       append(hql);  
  28.      }  
  29.      return this;  
  30.     }  
  31.   
  32.     public DynamicQuery append(String hql, String[] names, Object[] values) {  
  33.         this.hql.append(" ").append(hql);  
  34.         if (names != null && names.length != 0) {  
  35.             parameterNames.addAll(Arrays.asList(names));  
  36.         }  
  37.         if (values != null && values.length != 0) {  
  38.             parameterValues.addAll(Arrays.asList(values));  
  39.         }  
  40.         return this;  
  41.     }  
  42.   
  43.     public DynamicQuery append(String hql, List<String> names, List<Object> values){  
  44.         this.hql.append(" ").append(hql);  
  45.         if (names != null && !names.isEmpty()) {  
  46.             parameterNames.addAll(names);  
  47.         }  
  48.         if (values != null && !values.isEmpty()) {  
  49.             parameterValues.addAll(values);  
  50.         }  
  51.         return this;  
  52.     }  
  53.   
  54.     public DynamicQuery append(String hql, String name, Object value) {  
  55.         return append(hql, new String[]{name}, new Object[]{value});  
  56.     }  
  57.   
  58.     public DynamicQuery appendIfNotNull(String hql, String name, Object value) {  
  59.         if (value != null) {  
  60.             return append(hql, name, value);  
  61.         }  
  62.         return this;  
  63.     }  
  64.   
  65.     public DynamicQuery appendIfNotEmpty(String hql, String name, String value) {  
  66.         if (StringUtils.isNotBlank(value)) {  
  67.             return append(hql, name, StringUtils.trim(value));  
  68.         }  
  69.         return this;  
  70.     }  
  71.      
  72.     public DynamicQuery appendIfNotEmpty(String hql, String name, Collection<?> collection) {  
  73.      if (CollectionUtils.isNotEmpty(collection)) {  
  74.       return append(hql, name, collection);  
  75.      }  
  76.      return this;  
  77.     }  
  78.      
  79.     public DynamicQuery appendLikeIfNotEmpty(String hql, String name, String value) {  
  80.      return appendLikeIfNotEmpty(hql, name, value, MatchMode.ANYWHERE);  
  81.     }  
  82.      
  83.     public DynamicQuery appendLikeIfNotNull(String hql,String name, Long value){  
  84.      if(null != value){  
  85.       return append(hql,name,value);  
  86.      }  
  87.      return this;  
  88.     }  
  89.      
  90.     public DynamicQuery appendLikeIfNotEmpty(String hql, String name, String value, MatchMode matchMode) {  
  91.      if (StringUtils.isNotBlank(value)) {  
  92.       return appendLike(hql, name, value, matchMode);  
  93.         }  
  94.         return this;  
  95.     }  
  96.      
  97.  private DynamicQuery appendLike(String hql, String name, String value, MatchMode matchMode) {  
  98.   //TODO check me for some days   
  99.   String regex = "(?i)\\slike\\s+:" + name + "(?=(\\s|\\)|$))";  
  100.   Matcher matcher = Pattern.compile(regex).matcher(hql);  
  101.   if (matcher.find()) {  
  102.    int appendStart = matcher.end();  
  103.    String front = StringUtils.substring(hql, 0, appendStart);  
  104.    String back = StringUtils.substring(hql, appendStart);  
  105.    String likeHql = front + " escape \'^\' " + back;  
  106.    String likeValue = StringUtils.trim(value).replaceAll("%""^%").replaceAll("_""^_");  
  107.    return append(likeHql, name, matchMode.toMatchString(likeValue));  
  108.   }  
  109.   throw new IllegalArgumentException("Like hql[" + hql + "] is error format.");  
  110.  }  
  111.   
  112.  public DynamicQuery appendIfNotEmpty(String hql, String name, Object[] values) {  
  113.      return appendIfNotEmpty(hql, name, values != null ? Arrays.asList(values) : Collections.EMPTY_LIST);  
  114.     }  
  115.   
  116.     public String getQueryString() {  
  117.         return this.hql.toString();  
  118.     }  
  119.      
  120.   
  121.     /** 
  122.      * Apply the given name parameter to the given Query object. 
  123.      * 
  124.      * @param query the Query object 
  125.      * @param name  the name of the parameter 
  126.      * @param value the value of the parameter 
  127.      */  
  128.     @SuppressWarnings("unchecked")  
  129.     private void setParameter(Query query, String name, Object value) {  
  130.   
  131.         if (value instanceof Collection) {  
  132.             query.setParameterList(name, (Collection) value);  
  133.         } else if (value instanceof Object[]) {  
  134.             query.setParameterList(name, (Object[]) value);  
  135.         } else {  
  136.             query.setParameter(name, value);  
  137.         }  
  138.     }  
  139.   
  140.   
  141.     public Query build(Session session) {  
  142.         Query query = session.createQuery(this.getQueryString());  
  143.         if (parameterNames != null && !parameterNames.isEmpty()) {  
  144.             for (int i = 0; i < parameterNames.size(); i++) {  
  145.                 this.setParameter(query, parameterNames.get(i), this.parameterValues.get(i));  
  146.             }  
  147.         }  
  148.         return query;  
  149.     }  
  150. }  
  151.   
  152.    
  153.   
  154.    
  155.   
  156. 使用代码如下:  
  157.   
  158.  /** 
  159.   * 分页查询时使用 
  160.   * 
  161.   * @param <T> 
  162.   * @param paginater 
  163.   * @param searchCondition 
  164.   * @return 
  165.   */  
  166.  public <T> Paginater<T> paginate(Paginater<T> paginater, final ProductItemPriceCondition searchCondition) {  
  167.   
  168.   Sorter sorter = paginater.getSorter();  
  169.   if (sorter.isEmpty()) {  
  170.    sorter = new Sorter().asc("p.startDate");  
  171.   }  
  172.   LimitedList<T> limitedList = findByQuery(new QueryCreator() {  
  173.    public Query createQuery(Session session) {  
  174.     DynamicQuery dynamicQuery = new DynamicQuery("select distinct p from " + searchCondition.getForTypeName() + " p where (1 = 1) ");  
  175.     dynamicQuery.appendIfNotNull(" and  p.startDate<=:endDate ""endDate", searchCondition.getEndDate());  
  176.     dynamicQuery.appendIfNotNull(" and p.endDate>=:startDate ""startDate", searchCondition.getStartDate());  
  177.     dynamicQuery.appendIfNotNull("and p.productId=:productId ""productId", searchCondition.getProductId());  
  178.     return dynamicQuery.build(session);  
  179.    }  
  180.   }, paginater.getLimit(), sorter);  
  181.   return paginater.fromLimitedList(limitedList);  
  182.  }  

相关内容