利用DetachedCriteria构建HQL参数动态匹配
2024-10-09 02:17:49
此文章是基于 搭建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);
} }
最新文章
- 【逆向篇】分析一段简单的ShellCode——从TEB到函数地址获取
- Linux下配置一个VNC服务器
- Linux TC基于CBQ队列的流量管理范例
- WPF RichTextBox的使用总结
- 微信JS-SDK应用DEMO
- 小学生之Map集合框架的使用
- Pthon MySQLdb 的安装
- 【python标准库】内建函数
- CSS样式覆盖规则
- JSP/Servlet Web 学习笔记 DaySix —— EL表达式
- UML简要
- JSP获取input(含正则表达式)
- 【汇编语言】Win10 安装 DOXBox0.74
- spring框架加载完成后执行上下文刷新事件(ContextRefreshedEvent)
- 有钱人都用iphone?
- ESB(Enterprise Service Bus)企业服务总线介绍
- Python web 框架之 Django 基础搭建服务
- 【Python接口测试】简单系统登录接口测试实例
- 集成tomcat插件到eclipse
- SM2的非对称加解密java工具类
热门文章
- Android总结之Gzip/Zip压缩
- SQL Server-聚焦使用索引和查询执行计划(五)
- android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。
- Oracle使用SQL传输表空间
- Oracle 11g静默安装软件+手工创建数据库
- 使用TypeScript拓展你自己的VS Code!
- 用Github pages搭建自己制作的网页,方法最简单,适用于新手
- IE6+未知尺寸元素水平垂直居中
- [原创]django+ldap+memcache实现单点登录+统一认证
- 学习javascript数据结构(二)——链表