package cn.com.oneslife.dao;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class HibernateDAO extends HibernateDaoSupport {
/**
* @param hql
* @param bean
* @return
* @throws SecurityException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public String getQuery(String hql, Object bean) throws SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Class<?> cl = bean.getClass();
Field[] fields = cl.getDeclaredFields();
Map<String, Object> listParam = new HashMap<String, Object>();
String fieldName = null;
String regex = "(and)?\\s+[a-zA-Z0-9]*\\.?[a-zA-Z0-9]*\\s+=\\s+:("
+ fieldName + ")";
for (Field field : fields) {
String methodName = "get"
+ field.getName().substring(0, 1).toUpperCase();
methodName += field.getName().substring(1);
Method method = cl.getMethod(methodName);
Object object = method.invoke(bean, new Object[] {});
fieldName = field.getName();
if (null == object) {
hql = hql.replaceAll(regex, "");
} else {
listParam.put(field.getName(), object);
}
}
hql = hql.replaceAll("where", "where true and");
hql = hql.replaceAll("set\\s+and", "set");
Query query = this.getSession().createQuery(hql);
loadParam(query, listParam);
return hql;
}
/**
* @param hql
* @param parameters
* @return
*/
public Query getQuery(String hql, Object... parameters) {
Query query = this.getSession().createQuery(hql);
for (int index = 0; index < parameters.length; index++) {
query.setParameter(index + 1, parameters[index]);
}
return query;
}
/**
* @param query
* @param parameters
* @return
*/
private Query loadParam(Query query, Map<String, Object> parameters) {
Set<Map.Entry<String, Object>> set = parameters.entrySet();
Iterator<Entry<String, Object>> iter = set.iterator();
while (iter.hasNext()) {
Entry<String, Object> entry = iter.next();
query.setParameter(entry.getKey(), entry.getValue());
}
return query;
}
}
分享到:
相关推荐
- **创建Query实例**: - `Query query = session.createQuery("from User u where u.userName like ?");` - **主要方法**: - **setXXX()**:用于设置HQL中的占位符(`?` 或变量名)的值。 - `setString(int ...
HQL允许动态创建对象实例,将查询结果封装到对象中。例如,`select new TUser(user.name, user.age) from TUser as user`将创建一个新的TUser对象,仅包含name和age属性。注意,这些对象无法用于更新操作,因为其他...
HQL(Hibernate Query Language)是Hibernate框架中用于查询数据库的一种面向对象的查询语言。它允许开发人员以面向对象的方式编写查询,而不是直接使用SQL。HQL支持各种查询操作,包括插入、删除、更新以及复杂的...
根据提供的标题、描述以及部分代码内容,我们可以了解到这段材料主要涉及的是Hibernate框架中的HQL(Hibernate Query Language)查询语言的使用。接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate...
HQL,即Hibernate Query Language,是Hibernate框架提供的一种查询语言。它的语法结构与SQL类似,但在设计理念上却是面向对象的,能够很好地处理面向对象程序中的概念,例如继承、多态性和关联等。 #### 二、HQL的...
Hibernate Query Language(HQL)是Hibernate框架提供的面向对象的查询语言,它在外观上类似于SQL,但具有显著的面向对象特性,如支持继承、多态和关联。本教程将深入讲解HQL的基本概念、用法和特性。 ### 1. 大小...
通过上述实例,我们可以看到HQL不仅支持基本的CRUD操作,还支持更高级的功能,如模糊查询、参数绑定、聚合函数、分页以及多表关联等。掌握这些技巧,对于高效地利用Hibernate进行数据库操作至关重要。
### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...
HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,它类似于SQL,但更加面向对象。本文将深入解析HQL语句的常见用法。 1. 大小写敏感性 HQL对Java类和属性的名称是大小写敏感的,但在关键字和...
HQL,即Hibernate Query Language,是一种强大且面向对象的查询语言,由Hibernate框架提供。尽管HQL的语法结构与SQL相似,但其设计理念完全不同,HQL是专门为面向对象的数据查询而设计的。它能够理解和处理诸如继承...
《HQL语言教程[归类].pdf》是一个关于Hibernate Query Language(HQL)的详细教程,专注于面向对象的查询技术。HQL是Hibernate框架中用于检索和操作对象关系映射数据的强大工具,其语法和SQL有诸多相似之处,但设计...
HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的机制来查询数据库中的数据,并将其映射到Java对象上。本篇文章将根据给定的信息深入探讨HQL的基本语法结构及其使用方法。 #### 1. ...
本篇文章将探讨Hibernate的加载方式以及多态加载的概念。 首先,我们关注Session中的`load`和`get`方法。`load`方法是用于根据主键加载对象,它支持CGLIB懒加载(lazy loading)动态代理。当lazy属性设置为true时,...
本篇文章将深入探讨HQL语法,帮助开发者熟练掌握其在实际项目中的应用。 **一、HQL基础** 1. **查询语句结构**:HQL查询语句的基本结构类似于SQL,由`FROM`、`WHERE`、`SELECT`、`GROUP BY`、`ORDER BY`等关键字...
HQL(Hibernate Query Language)是一种基于对象的查询语言,主要用于 Hibernate 框架中对数据库的查询操作。与 SQL 相比,HQL 的查询方式和语法都有所不同。 首先,HQL 的查询目标是对象,而不是数据库表。因此,...
### HQL经典语句解析与应用 HQL(Hibernate Query Language)是Hibernate框架提供的一种查询语言,它结合了SQL的强大功能和...同时,理解HQL和QBC之间的差异和适用场景,将有助于开发者在实际项目中做出更合理的选择。
HQL中最基本的查询形式是`from`子句,例如`from eg.Cat`,这将返回`eg.Cat`类的所有实例。默认情况下,Hibernate启用自动引入(auto-import),所以通常不需要使用类的全限定名。可以简化为`from Cat`。为了在后续...
HQL,即Hibernate Query Language,是Hibernate提供的一种强大的查询语言。虽然它的语法结构看起来与SQL类似,但其实质上是一种面向对象的语言,能够理解并处理诸如继承、多态及关联等概念。 #### 二、HQL的基本...