`
firecool
  • 浏览: 83868 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

将HQL以及参数加载到Query实例中

    博客分类:
  • java
阅读更多
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;
    }
}
分享到:
评论

相关推荐

    Hibernate 课件_HQL

    - **创建Query实例**: - `Query query = session.createQuery("from User u where u.userName like ?");` - **主要方法**: - **setXXX()**:用于设置HQL中的占位符(`?` 或变量名)的值。 - `setString(int ...

    hql语句大全

    HQL允许动态创建对象实例,将查询结果封装到对象中。例如,`select new TUser(user.name, user.age) from TUser as user`将创建一个新的TUser对象,仅包含name和age属性。注意,这些对象无法用于更新操作,因为其他...

    HQL语句大全

    HQL(Hibernate Query Language)是Hibernate框架中用于查询数据库的一种面向对象的查询语言。它允许开发人员以面向对象的方式编写查询,而不是直接使用SQL。HQL支持各种查询操作,包括插入、删除、更新以及复杂的...

    HQL是hibernate自己的一套查询

    根据提供的标题、描述以及部分代码内容,我们可以了解到这段材料主要涉及的是Hibernate框架中的HQL(Hibernate Query Language)查询语言的使用。接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate...

    HQL详解

    HQL,即Hibernate Query Language,是Hibernate框架提供的一种查询语言。它的语法结构与SQL类似,但在设计理念上却是面向对象的,能够很好地处理面向对象程序中的概念,例如继承、多态性和关联等。 #### 二、HQL的...

    hql语句经典教程

    Hibernate Query Language(HQL)是Hibernate框架提供的面向对象的查询语言,它在外观上类似于SQL,但具有显著的面向对象特性,如支持继承、多态和关联。本教程将深入讲解HQL的基本概念、用法和特性。 ### 1. 大小...

    Hibernate 经常用的一些HQL语句

    通过上述实例,我们可以看到HQL不仅支持基本的CRUD操作,还支持更高级的功能,如模糊查询、参数绑定、聚合函数、分页以及多表关联等。掌握这些技巧,对于高效地利用Hibernate进行数据库操作至关重要。

    hibernate 中HQL语句查询学习笔记

    ### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...

    常用的hql语句用法解析

    HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,它类似于SQL,但更加面向对象。本文将深入解析HQL语句的常见用法。 1. 大小写敏感性 HQL对Java类和属性的名称是大小写敏感的,但在关键字和...

    Hibernate_HQL大全

    HQL,即Hibernate Query Language,是一种强大且面向对象的查询语言,由Hibernate框架提供。尽管HQL的语法结构与SQL相似,但其设计理念完全不同,HQL是专门为面向对象的数据查询而设计的。它能够理解和处理诸如继承...

    HQL语言教程[归类].pdf

    《HQL语言教程[归类].pdf》是一个关于Hibernate Query Language(HQL)的详细教程,专注于面向对象的查询技术。HQL是Hibernate框架中用于检索和操作对象关系映射数据的强大工具,其语法和SQL有诸多相似之处,但设计...

    hql语句语法详解hql语句

    HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的机制来查询数据库中的数据,并将其映射到Java对象上。本篇文章将根据给定的信息深入探讨HQL的基本语法结构及其使用方法。 #### 1. ...

    Hibernate加载方式与多态加载分析

    本篇文章将探讨Hibernate的加载方式以及多态加载的概念。 首先,我们关注Session中的`load`和`get`方法。`load`方法是用于根据主键加载对象,它支持CGLIB懒加载(lazy loading)动态代理。当lazy属性设置为true时,...

    J2EE HQL语法大全

    本篇文章将深入探讨HQL语法,帮助开发者熟练掌握其在实际项目中的应用。 **一、HQL基础** 1. **查询语句结构**:HQL查询语句的基本结构类似于SQL,由`FROM`、`WHERE`、`SELECT`、`GROUP BY`、`ORDER BY`等关键字...

    HQL与SQL的区别[文].pdf

    HQL(Hibernate Query Language)是一种基于对象的查询语言,主要用于 Hibernate 框架中对数据库的查询操作。与 SQL 相比,HQL 的查询方式和语法都有所不同。 首先,HQL 的查询目标是对象,而不是数据库表。因此,...

    HQL经典语句

    ### HQL经典语句解析与应用 HQL(Hibernate Query Language)是Hibernate框架提供的一种查询语言,它结合了SQL的强大功能和...同时,理解HQL和QBC之间的差异和适用场景,将有助于开发者在实际项目中做出更合理的选择。

    Hibernate HQL.doc

    HQL中最基本的查询形式是`from`子句,例如`from eg.Cat`,这将返回`eg.Cat`类的所有实例。默认情况下,Hibernate启用自动引入(auto-import),所以通常不需要使用类的全限定名。可以简化为`from Cat`。为了在后续...

    hibernate hql基本操作

    HQL,即Hibernate Query Language,是Hibernate提供的一种强大的查询语言。虽然它的语法结构看起来与SQL类似,但其实质上是一种面向对象的语言,能够理解并处理诸如继承、多态及关联等概念。 #### 二、HQL的基本...

Global site tag (gtag.js) - Google Analytics