- 浏览: 7325979 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
在项目中Hibernate中Criteria和Query查询,总是缺少不了一些列的判断等,无论数据类型是什么,这些是必须的,最终动态添加的也是的获取Criteria和Query组成的hql,于是公司兄弟将Criteria和Query进行了抽出封装,采用设计模式中Builder的模式将组成hql过程的判断进行封装组合,使大家在使用时减少了判断是否为空或者空字符串等,细细的相信其实这也是设计模式的一部分好处吧!
封装类如下:
public class DynamicQuery {
private StringBuilder hql = new StringBuilder();
public List<String> parameterNames = new ArrayList<String>();
public List<Object> parameterValues = new ArrayList<Object>();
public List<String> getParameterNames() {
return parameterNames;
}
public List<Object> getParameterValues() {
return parameterValues;
}
public DynamicQuery(String hql) {
this.hql.append(hql);
}
public DynamicQuery append(String hql) {
return append(hql, (String[]) null, (String[]) null);
}
public DynamicQuery appendIfTrue(String hql, boolean condition) {
if (condition) {
append(hql);
}
return this;
}
public DynamicQuery append(String hql, String[] names, Object[] values) {
this.hql.append(" ").append(hql);
if (names != null && names.length != 0) {
parameterNames.addAll(Arrays.asList(names));
}
if (values != null && values.length != 0) {
parameterValues.addAll(Arrays.asList(values));
}
return this;
}
public DynamicQuery append(String hql, List<String> names, List<Object> values){
this.hql.append(" ").append(hql);
if (names != null && !names.isEmpty()) {
parameterNames.addAll(names);
}
if (values != null && !values.isEmpty()) {
parameterValues.addAll(values);
}
return this;
}
public DynamicQuery append(String hql, String name, Object value) {
return append(hql, new String[]{name}, new Object[]{value});
}
public DynamicQuery appendIfNotNull(String hql, String name, Object value) {
if (value != null) {
return append(hql, name, value);
}
return this;
}
public DynamicQuery appendIfNotEmpty(String hql, String name, String value) {
if (StringUtils.isNotBlank(value)) {
return append(hql, name, StringUtils.trim(value));
}
return this;
}
public DynamicQuery appendIfNotEmpty(String hql, String name, Collection<?> collection) {
if (CollectionUtils.isNotEmpty(collection)) {
return append(hql, name, collection);
}
return this;
}
public DynamicQuery appendLikeIfNotEmpty(String hql, String name, String value) {
return appendLikeIfNotEmpty(hql, name, value, MatchMode.ANYWHERE);
}
public DynamicQuery appendLikeIfNotNull(String hql,String name, Long value){
if(null != value){
return append(hql,name,value);
}
return this;
}
public DynamicQuery appendLikeIfNotEmpty(String hql, String name, String value, MatchMode matchMode) {
if (StringUtils.isNotBlank(value)) {
return appendLike(hql, name, value, matchMode);
}
return this;
}
private DynamicQuery appendLike(String hql, String name, String value, MatchMode matchMode) {
//TODO check me for some days
String regex = "(?i)\\slike\\s+:" + name + "(?=(\\s|\\)|$))";
Matcher matcher = Pattern.compile(regex).matcher(hql);
if (matcher.find()) {
int appendStart = matcher.end();
String front = StringUtils.substring(hql, 0, appendStart);
String back = StringUtils.substring(hql, appendStart);
String likeHql = front + " escape \'^\' " + back;
String likeValue = StringUtils.trim(value).replaceAll("%", "^%").replaceAll("_", "^_");
return append(likeHql, name, matchMode.toMatchString(likeValue));
}
throw new IllegalArgumentException("Like hql[" + hql + "] is error format.");
}
public DynamicQuery appendIfNotEmpty(String hql, String name, Object[] values) {
return appendIfNotEmpty(hql, name, values != null ? Arrays.asList(values) : Collections.EMPTY_LIST);
}
public String getQueryString() {
return this.hql.toString();
}
/**
* Apply the given name parameter to the given Query object.
*
* @param query the Query object
* @param name the name of the parameter
* @param value the value of the parameter
*/
@SuppressWarnings("unchecked")
private void setParameter(Query query, String name, Object value) {
if (value instanceof Collection) {
query.setParameterList(name, (Collection) value);
} else if (value instanceof Object[]) {
query.setParameterList(name, (Object[]) value);
} else {
query.setParameter(name, value);
}
}
public Query build(Session session) {
Query query = session.createQuery(this.getQueryString());
if (parameterNames != null && !parameterNames.isEmpty()) {
for (int i = 0; i < parameterNames.size(); i++) {
this.setParameter(query, parameterNames.get(i), this.parameterValues.get(i));
}
}
return query;
}
}
使用代码如下:
/**
* 分页查询时使用
*
* @param <T>
* @param paginater
* @param searchCondition
* @return
*/
public <T> Paginater<T> paginate(Paginater<T> paginater, final ProductItemPriceCondition searchCondition) {
Sorter sorter = paginater.getSorter();
if (sorter.isEmpty()) {
sorter = new Sorter().asc("p.startDate");
}
LimitedList<T> limitedList = findByQuery(new QueryCreator() {
public Query createQuery(Session session) {
DynamicQuery dynamicQuery = new DynamicQuery("select distinct p from " + searchCondition.getForTypeName() + " p where (1 = 1) ");
dynamicQuery.appendIfNotNull(" and p.startDate<=:endDate ", "endDate", searchCondition.getEndDate());
dynamicQuery.appendIfNotNull(" and p.endDate>=:startDate ", "startDate", searchCondition.getStartDate());
dynamicQuery.appendIfNotNull("and p.productId=:productId ", "productId", searchCondition.getProductId());
return dynamicQuery.build(session);
}
}, paginater.getLimit(), sorter);
return paginater.fromLimitedList(limitedList);
}
代码实属完整,哈哈,以备后用!希望同学们拍砖哦 !!
评论
这个东西好像使用时有点局限性,忘了?
有局限性吗?~如果有的话,只能说表设计的不合理,可以多添加一个表就能解决很多问题`我是这么认为~
我一直用DetachedCriteria感觉不错~很符合JAVA开发的标准
其实如果“砖块代码”一次可以通用这也达到目的了 ,^_^,为了就是这个通用
这个东西好像使用时有点局限性,忘了?
发表评论
-
编程的十四条经验
2013-05-06 10:32 1816排列不分先后: 1. 当 ... -
整合Struts2+JasperReport Web报表应用示例
2013-04-22 13:56 2280整合Struts2+JasperReport Web报表应用 ... -
关于H2使用的那些事
2012-12-14 16:40 27164在项目中采用H2作为工 ... -
Java 分割功能实现
2011-08-25 08:39 2789在项目针对比较大的文件需要文件的分割功能,特意写了一个 ... -
反射工具类
2010-04-25 10:47 2393package easyway.tbs.client.bm.u ... -
json 在项目中开发一个巧妙地应用
2009-12-12 16:49 3899在项目中需要保存客户的信息到Cookie中,因为客户要求 ... -
项目中使用时间工具类
2009-11-21 16:43 3024项目中使用的时间工具类的主要的采用commons-l ... -
将HTML文件转换为图片应用开发
2009-10-21 11:15 4453项目使用的基 ... -
Spring项目的测试用例
2009-08-22 12:49 2325在项目的开发过程中使用Junit4测试代码,使用 ... -
jBPM与Spring整合浅析
2009-08-22 12:41 26561、创建公文流转相关的实体类,并创建数据库表 2、根据对用 ... -
Hibernate正向工程hbm2ddl
2009-08-19 10:14 2302一般在项目开 ... -
Hibernate中用户类型(User Type)应用
2009-08-16 09:08 3131在项目中许多地方使用枚举类,枚举对象值对应数据一个常 ... -
关于常用城市控件中数据的处理方案
2009-08-15 19:41 2407在项目中由于多次使用的国家省份城市的控件,以前采 ... -
在Spring2.5注解时必须注意几点
2009-08-15 19:22 2127项目中采用Spring2.5配置重点内容如下: ... -
中文转换拼音的实现思路以及实现
2009-08-15 18:40 2900在项目中一位大师兄写的中文转换拼音代码:自己整理一下 ... -
在项目中一些相关常量数组使用枚举应用
2009-08-15 18:01 2610在项目中采用Hibernate中支持枚举类型因此我们使用许 ... -
在项目开发中关于Hibernate注解的配置的一些说明
2009-08-15 13:26 4343在项目开发中采用Hibernate3注解方式实现关 ... -
关于项目中泛型的应用
2009-08-15 12:38 2386在项目采用JDK1.6采用泛型开发,在开发应用之中减少了大 ... -
针对项目中XML解析的扩展应用
2009-08-15 12:14 2575由于项目中多个需 ...
相关推荐
Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时...在实际项目中,可以根据需求选择使用HQL(Hibernate Query Language)或Criteria API,两者各有优势,选择取决于具体场景和团队偏好。
在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...
Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL(Hibernate Query Language)三种方式。 QBE(Query By Example) QBE 是一种基于示例的查询机制,它可以根据一个示例对象来...
使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。例如,创建一个 Criteria 实例 org.hibernate.Criteria 接口表示,可以使用 Criteria 的 add(Criterion ...
在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...
本文将深入探讨如何利用Hibernate查询数据库中的所有记录。 首先,理解Hibernate的基本原理至关重要。Hibernate通过XML配置文件或注解将Java类与数据库表进行映射,使得我们可以使用面向对象的方式来处理数据库操作...
《Hibernate查询条件查询详解》 Hibernate作为Java领域中广受欢迎的对象关系映射(ORM)框架,极大地简化了数据库操作。...在学习和实践中,不断探索和理解Hibernate的查询机制,将使我们在Java开发中游刃有余。
在Hibernate的Criteria API中,模糊查询主要通过`Restrictions.like()`方法来实现。该方法接受两个参数:字段名和包含通配符的字符串。 ##### 示例1:单字段模糊查询 ```java // 查找名字中包含“Erica”的用户 ...
Criteria API基于CriteriaQuery接口,提供了丰富的查询选项,包括排序、分页、聚合函数等,这使得开发者能够更加灵活地进行数据检索。 ### 使用Criteria进行基本查询 在给定的部分内容中,首先展示的是如何使用...
Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...
本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...
总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...
### Hibernate Criteria 排序问题详解 #### 一、前言 在使用Hibernate进行数据库操作时,经常...通过掌握这些知识点,开发者可以更加灵活高效地使用Hibernate Criteria API来进行数据查询和排序操作,提高开发效率。
在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...
在实际应用中,你还可以结合Hibernate的 Criteria 查询、Criteria API 或者 JPA 的 Query API 来实现更复杂的聚合查询,如带条件的聚合、子查询等。 总之,Hibernate提供的聚合函数使得在Java应用程序中进行数据...
在Java世界里,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用...在实际项目中,根据需求选择合适的查询方式,如HQL、Criteria或Query,是优化性能和提升开发体验的关键。
在Java的持久化框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来构建动态和复杂的查询。Criteria API的主要优点在于它的灵活性,允许开发者在运行时构建查询,而不必预先定义HQL(Hibernate Query ...
如果某些查询模式经常被使用,可以定义命名查询,将其写入XML映射文件中,以提高代码可读性和复用性。 6. **动态HQL**: 对于更动态的查询,可以构建HQL字符串,但这可能会引入SQL注入风险,因此要确保正确处理...