利用DetachedCriteria构建HQL参数动态匹配
此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台
一. 类文件介绍
1. CriteriaBuilder.java,DetachedCriteria构建类
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;
}
二. 使用方法介绍
1. 使用如类:WarehouseBSImpl.java
public class WarehouseBSImpl implements WarehouseBS{
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);
}
}
利用DetachedCriteria构建HQL参数动态匹配的更多相关文章
- 全面解读Python Web开发框架Django,利用Django构建web应用及其部署
全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...
- Spark:利用Eclipse构建Spark集成开发环境
前一篇文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上 ...
- [Gradle] 在 Eclipse 下利用 gradle 构建系统
转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者 ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...
- 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像
Dockerfile内容如下: FROM centos MAINTAINER Victor ivictor@foxmail.com WORKDIR /root RUN rm -f /etc/yum.r ...
- asp.net向后台传参数动态加载图片
//向后台传参数动态加载图片 $(function() { $("#Button1").click(function() { var stockcode = getUrlParam ...
- springboot+mybatis-puls利用swagger构建api文档
项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...
- 利用openssl构建根证书-服务器证书-客户证书
利用openssl构建根证书-服务器证书-客户证书 OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理 一.构建根证书 1.构建根证书前,需要构建随机数文件(.rand) ...
- [转]利用Docker构建开发环境
利用Docker构建开发环境 Posted by makewonder on 2014 年 4 月 2 日 最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...
随机推荐
- 作为Coder的利器记载
工作近三年,使用PC快六年,拥抱Mac整一年,投具器石榴裙三年.14年第一次被同事推荐Everything,开启了JeffJade对工具的折腾之旅,并乐此不疲.时去两年,这必然是消耗了一些时间,但对效 ...
- 读取xml数据装配到字典中之应用场景
前段时间看到支付宝设置里面有个多语言这个功能,蛮有意思的,就想双休没事的话做个相关的demo玩玩,可是礼拜六被妹子拽出去玩了一天,来大上海有大半年了,基本没有出去玩过,妹子说我是超级宅男,也不带她出去 ...
- Spark 生态系统组件
摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...
- PDO
'PDO'是数据访问抽象层'用mysqli类找到mysqli驱动根据驱动操作mysqli数据库'其他类找到sqlserver驱动根据驱动操作sqlserve数据库'PDO 访问其他数据库 PDO的用法 ...
- 通过Zabbix API实现对主机的增加(无主机资产的添加和带主机资产的添加)、删除、获取主机id、获取模板id、获取组id
config.yaml存储zabbix的信息(主要包括zabbix server的url .请求头部.登陆的用户名密码) Zabbix_Config: zabbix_url: http://192.1 ...
- webpack入门之简单例子跑起来
webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载的模块进行代码分割,等到实际需要的时 ...
- 08. Web大前端时代之:HTML5+CSS3入门系列~H5 Web存储
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html
- Redis系列之key操作命令与Redis中的事务详解(六)
序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...
- Grunt(页面静态引入的文件地址的改变探究)-V2.0
相关插件的引用: grunt-usemin 对页面的操作 grunt-contrib-cssmin 压缩css load-grunt-tasks 瘦身gruntfile grunt-rev给md5 ...
- Java内存模型深度解析:总结--转
原文地址:http://www.codeceo.com/article/java-memory-7.html 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会 ...