利用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搭建了自己完整的开发环境, ...
随机推荐
- 【译】Unity3D Shader 新手教程(2/6) —— 积雪Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的 ...
- Hadoop Shell命令大全
hadoop支持命令行操作HDFS文件系统,并且支持shell-like命令与HDFS文件系统交互,对于大多数程序猿/媛来说,shell-like命令行操作都是比较熟悉的,其实这也是Hadoop的极大 ...
- [C#] Linq To Objects - 如何操作字符串
Linq To Objects - 如何操作字符串 开篇语: 上次发布的 <LINQ:进阶 - LINQ 标准查询操作概述>(90+赞) 社会反响不错,但自己却始终觉得缺点什么!“纸上得来 ...
- 计算机程序的思维逻辑 (46) - 剖析PriorityQueue
上节介绍了堆的基本概念和算法,本节我们来探讨堆在Java中的具体实现类 - PriorityQueue. 我们先从基本概念谈起,然后介绍其用法,接着分析实现代码,最后总结分析其特点. 基本概念 顾名思 ...
- Bootstrap框架的学习(二)
一.下载Bootstrap Bootstrap (当前版本 v3.3.0)提供以下几种方式帮你快速上手,每一种方式针对具有不同技能等级的开发者和不同的使用场景. 下载地址:http://v3.boot ...
- wordpress插件bug排查后记(记一次由于开启memecached引起的插件bug)
这篇文章是写给自己的. 周三的时候我在维护公司的一个wordpress项目页面时发现了一个非常奇怪的情况:当我尝试更新网站上的一个页面后,在wordpress后台的编辑器中发现其内容并没有按我预期的将 ...
- HTTPS那些事(一)HTTPS原理
转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...
- Azure Backup (3) 使用Azure备份服务,备份Azure虚拟机
<Windows Azure Platform 系列文章目录> 本将介绍,如何使用Azure备份服务,备份Azure虚拟机. 我们先预先创建2台Windows VM (命名为LeiVM00 ...
- 在Ubuntu|CentOS上安装Shutter截图工具及快捷键设置
简介 Shutter前身叫GScrot,它是一款相当棒的截图软件. 通过Shutter,你可以截取包括选定区域.全屏幕.窗口.窗口内的控件甚至网页的图像.通过内置的强大插件机制,你可以在截图后,对图像 ...
- js正则表达式校验非负整数:^\d+$ 或 ^[1-9]\d*|0$
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...