利用DetachedCriteria构建HQL参数动态匹配

此文章是基于 搭建SpringMVC+Spring+Hibernate平台

1. DetachedCriteria构建类:CriteriaBuilder.java

package com.ims.persistence.base;

import java.math.BigDecimal;
import java.sql.Types;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import com.ims.common.DateUtil;

public class CriteriaBuilder {
    private DetachedCriteria detachedCriteria;
    private Map<String, ?> parmasMap;

    public CriteriaBuilder(DetachedCriteria detachedCriteria, Map<String, ?> parmasMap){
        this.detachedCriteria = detachedCriteria;
        this.parmasMap = parmasMap;
    }

    public DetachedCriteria addCriterion(String propertyName,String paramName){
        return addCriterion(propertyName,paramName,Expression.EQ);
    }

    public DetachedCriteria addCriterion(String propertyName,String paramName,Expression expression){
        return addCriterion(propertyName, paramName, Types.VARCHAR, expression);
    }

    public DetachedCriteria addCriterion(String propertyName,String paramName, Integer propertyType){
        return addCriterion(propertyName,paramName,propertyType,Expression.EQ);
    }

    public DetachedCriteria addCriterion(String propertyName,String paramName, Integer propertyType, Expression expression){
        if(parmasMap!=null){
            Criterion criterion = buildCriterion(propertyName,paramName,propertyType,expression);
            if(null!=criterion){
                detachedCriteria.add(criterion);
            }
        }
        return detachedCriteria;
    }

    private Criterion buildCriterion(String propertyName,String paramName,Integer propertyType,Expression expression){
        boolean propertyBlank = true;
        Object paramValue = parmasMap.get(paramName);
        if(paramValue!=null && StringUtils.isNotBlank(paramValue.toString())){
            propertyBlank = false;
        }

        Criterion criterion = null;
        if(!propertyBlank){
            switch(propertyType){
                case Types.INTEGER:
                    paramValue = Integer.valueOf(paramValue.toString());
                    break;
                case Types.VARCHAR:
                    paramValue = paramValue.toString();
                    break;
                case Types.DATE:
                    paramValue = DateUtil.stringToDate(paramValue.toString());
                    break;
                case Types.DECIMAL:
                    paramValue = new BigDecimal(paramValue.toString());
                    break;
            }
            switch(expression){
                case EQ:
                    criterion = Restrictions.eq(propertyName, paramValue);
                    break;
                case NE:
                    criterion = Restrictions.ne(propertyName, paramValue);
                    break;
                case GT:
                    criterion = Restrictions.gt(propertyName, paramValue);
                    break;
                case GE:
                    criterion = Restrictions.ge(propertyName, paramValue);
                    break;
                case LT:
                    criterion = Restrictions.lt(propertyName, paramValue);
                    break;
                case LE:
                    criterion = Restrictions.le(propertyName, paramValue);
                    break;
            }
        }
        return criterion;
    }

    public DetachedCriteria addLikeCriterion(String propertyName,String paramName){
        return addLikeCriterion(propertyName,paramName,MatchMode.ANYWHERE);
    }

    public DetachedCriteria addLikeCriterion(String propertyName,String paramName,MatchMode matchMode){
        if(parmasMap!=null){
            Criterion criterion = buildLikeCriterion(propertyName,paramName,matchMode);
            if(null!=criterion){
                detachedCriteria.add(criterion);
            }
        }
        return detachedCriteria;
    }

    public Criterion buildLikeCriterion(String propertyName,String paramName,MatchMode matchMode){
        Criterion criterion = null;
        Object paramValue = parmasMap.get(paramName);
        if(paramValue!=null && StringUtils.isNotBlank(paramValue.toString())){
            criterion = Restrictions.like(propertyName, paramValue.toString(), matchMode);
        }
        return criterion;
    }
}

2. 比较运算符枚举类:Expression.java

package com.ims.persistence.base;

public enum Expression {
    /** 等于  */
    EQ,
    /** 不等于 */
    NE,
    /** 大于 */
    GT,
    /** 大于等于 */
    GE,
    /** 小于 */
    LT,
    /** 小于等于 */
    LE;
}

3. 使用如类:WarehouseBSImpl.java

package com.ims.service.xxx.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ims.persistence.base.CriteriaBuilder;
import com.ims.persistence.dao.xxx.WarehouseDao;
import com.ims.persistence.model.xxx.Warehouse;
import com.ims.service.xxx.WarehouseBS;

@Service("warehouseBS")
public class WarehouseBSImpl implements WarehouseBS{
    @Autowired
    private WarehouseDao warehouseDao;

    private DetachedCriteria buildCriteria(DetachedCriteria detachedCriteria, Map<String, Object> params){
        CriteriaBuilder criteriaBuilder = new CriteriaBuilder(detachedCriteria, params);
        criteriaBuilder.addCriterion("warehouse.projectCode", "projectCode");
        return detachedCriteria;
    }

    @Override
    public List<Map<String, Object>> getWarehouses(String projectCode) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("projectCode", projectCode);
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Warehouse.class, "warehouse");
        buildCriteria(detachedCriteria, params);

        ProjectionList pList = Projections.projectionList();
        pList.add(Projections.property("warehouse.warehouseCode").as("value"));
        pList.add(Projections.property("warehouse.warehouseName").as("text"));
        detachedCriteria.setProjection(pList);
        detachedCriteria.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

        return warehouseDao.findByCriteria(detachedCriteria);
    }

}

时间: 2024-10-22 18:34:12

利用DetachedCriteria构建HQL参数动态匹配的相关文章

[Gradle] 在 Eclipse 下利用 gradle 构建系统

转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者来说,它们还是过于复杂,上手还是需要时间的.本文将向读者介绍一种全新的构建项目的方式 gradle,它简单.上手快,能大大节省项目的时间和成本. 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是

利用Nginx构建负载均衡服务器

大家都知道,一个域名对应一个IP地址,而一个WebSite则对应一个IP地址上对应端口服务的应用程序(或位置).而大型网站的并发访问量非常大,这些网站是如何在一台Web服务器上实现负载均衡的呢? 相信很多人会有与我同样的疑惑,但实际上成熟的解决方案已经大规模投入使用.而常用的则是反向代理方法. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理

在 Eclipse 下利用 gradle 构建系统

在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI. 开发工具:Eclipse IDE for SOA Developers 版本,请到 http://www.eclipse.org/downloads/ 网站下载,当然任何版本的 eclipse 都是可以的. Java

利用makefile构建c++项目的思路介绍

入门介绍 起因是我在工作中,遇到了一个多个执行文件打包成的组件,而每个执行文件都需要将pb编进二进制中,导致release包非常大.所以想到,是否应该将pb编程动态链接库,再供可执行文件使用呢?达成这个目的需要做两件事.1.将pb编成.so文件.2.将原本的链接方式改为动态链接. makefile是make构建项目所需要的规则文件.通产在其中指定了编译目标.编译指令.编译依赖.通常的makefile被命名为"Makefile""makefile",但也可以通过mak

重写TreeView,多层级节点下批量显示图片,图片支持缩略图和文件名列表切换,支持调用者动态匹配选中,支持外界拖入图片并添加到对应节点下

原文:重写TreeView,多层级节点下批量显示图片,图片支持缩略图和文件名列表切换,支持调用者动态匹配选中,支持外界拖入图片并添加到对应节点下 1.先看下整体效果 2.前端代码 1 <UserControl x:Class="iPIS.UI.Base.Tree.ImageTreeControl" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x=&quo

利用StarWind 构建SAN存储

StarWind iSCSI SAN 是一个iSCSI目标软件, 含有免费和付费版本. 该软件可安装在任何 32位或64位的Windows Server,使Windows Server 变为一台SAN . 支持多种虚拟化环境, 包括VMware, Microsoft Hyper-V和 Citrix. 在中小型企业中,可以部署其免费版本在测试环 境中进行测试和评估. 其免费版本也可以通过license直接升级为付费版本. 下面介绍其具体的安装和配置过程. 一.StarWind软件获取 软件站点:

asp.net向后台传参数动态加载图片

//向后台传参数动态加载图片 $(function() { $("#Button1").click(function() { var stockcode = getUrlParam("stockcode"); $.ajax({ //要用post方式 type: "Post", //方法所在页面和方法名 url: "IndustryChain.aspx/Photo", contentType: "application

[转]利用Docker构建开发环境

利用Docker构建开发环境 Posted by makewonder on 2014 年 4 月 2 日 最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环境(本文主要是面向Mac OS X),以及期间所遇到的一些坑和解决方案.(本文会要求你对PAAS.LXC.CGroup.AUFS有一定的了解基础,请自行Google ) 大背景–虚拟化技术历史

利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像

Dockerfile内容如下: FROM centos MAINTAINER Victor [email protected] WORKDIR /root RUN rm -f /etc/yum.repos.d/* RUN echo '[BASE]' > /etc/yum.repos.d/base.repo RUN echo 'name=base' >> /etc/yum.repos.d/base.repo RUN echo 'baseurl=http://192.168.244.132/