`
bd2007
  • 浏览: 395049 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate 动态 HQL

阅读更多


Hibernate 动态 HQL

在开发的时候,很多时候都遇到过需要动态拼写SQL,有的是在配置文件中写SQL,有的是在Java代码中拼写SQL,以配置文件拼SQL的可以拿IBatis为代表,但是很多时候是使用Hibernate的,这个时候就想要是Hibernate能像IBatis那样写就好了。这个时候就想到了模板语言和配置文件的结合。模板引擎可以选择Velocity,简单而不失强大,配置文件可以模仿Hibernate的sql-query 的XML文件。Sq-query的示例代码如下(SQL or HQL):<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE dynamic-hibernate PUBLIC "-//ANYFRAME//DTD DYNAMIC-HIBERNATE//EN""http://www.anyframejava.org/dtd/anyframe-dynamic-hibernate-mapping-4.0.dtd"><dynamic-hibernate>    <query name="selectUserSQL">        <![CDATA[            SELECT  USER_ID,NAME            FROM users_table Where 1=1            #if($name &amp;&amp; $name.length() > 1)             AND name =:name            #end    ]]>    </query>    <query name="selectUserHQL">    <![CDATA[         FROM users        Where 1=1            #if($name &amp;&amp; $name.length() > 1)                AND name =:name            #end        ]]>    </query> 在系统加载时,需要把配置文件加载到系统中。加载代码关键部分如下: 1   public class DynamicHibernateImpl implements InitializingBean, ResourceLoaderAware, ApplicationContextAware   2       public void afterPropertiesSet() throws Exception { 3          for (int i = 0; i < fileNames.size(); i++) { 4             String fileName = ((String) fileNames.get(i)).trim(); 5             if (resourceLoader instanceof ResourcePatternResolver) {                 6                 try { 7                     Resource[] resources=((ResourcePatternResolver) resourceLoader).getResources(fileName); 8                   buildHQLMap(resources); 9                 } catch (IOException ex) {10                     throw new Exception("Could not resolve sql definition resource pattern [" + fileName + "]", ex);11                 }12             } else {               13                 Resource resource = resourceLoader.getResource(fileName);14                 buildHQLMap(new Resource[] { resource });15             }16         }17     }18  protected void buildHQLMap(Resource[] resources) throws Exception {19         for (int i = 0; i < resources.length; i++) {20             buildHQLMap(resources[i]);21         }22     }23  private void buildHQLMap(Resource resource) throws Exception {24         try {25             InputSource inputSource = new InputSource(resource.getInputStream());26             org.w3c.dom.Document doc = this.documentLoader.loadDocument(inputSource, null, null, org.springframework.util.xml.XmlValidationModeDetector.VALIDATION_NONE, false);27             Element root = doc.getDocumentElement();28             List<Element> querys = DomUtils.getChildElements(root);29             for(Element query:querys){30                 String queryName = query.getAttribute("name");31                 if (StringUtils.isEmpty(queryName)) {32                     throw new Exception("DynamicHibernate Service : name is essential attribute in a <query>.");33                 }34                 if(statements.containsKey(queryName)){35                     throw new Exception("DynamicHibernate Service : duplicated query in a <query>."+queryName);36                 }37                 statements.put(queryName, DomUtils.getTextValue(query));38             }39         } catch (SAXParseException se) {40             throw se;41         } catch (IOException ioe) {42             throw ioe;43         }44     }Spring的配置文件示例如下:<bean id="dynamicHibernate" class="com.company.DynamicHibernateImpl"><property name="sessionFactory" ref="sessionFactory" /><property name="simpleTemplate" ref="simpleTemplate" /><property name="fileNames"><list><value>classpath*:hibernate/dynamic/dynamic-hibernate-*.xml</value></list></property></bean>下一步是在使用时调用sql并调用模板方法,进行sql动态化。还是DynamicHibernateImpl这个类  1     public List findList(String queryName, Map params, int pageIndex, int pageSize) throws Exception {  2         Context context = generateVelocityContext(params); 3         Query query = findInternal(queryName, context); 4         if (pageIndex > 0 &amp;&amp; pageSize > 0) { 5             query.setFirstResult((pageIndex - 1) * pageSize); 6             query.setMaxResults(pageSize); 7         } 8       return query.list();         9     };10   private Context generateVelocityContext(Map<String, Object> params) {11         VelocityContext context = new VelocityContext();12         if (null == params) {13             return null;14         }15         Iterator<String> iterator = params.keySet().iterator();16         while (iterator.hasNext()) {17             String key = iterator.next();18             Object value = params.get(key);19             if (null == value) {20                 continue;21             }           22             context.put(key, value);23         }24         return context;25     };26  private Query findInternal(String queryName, Context context) throws Exception {27         String sql = findSQLByVelocity(queryName, context);28         Query query = sessionFactory.getCurrentSession().createQuery(sql);29         String[] namedParams = query.getNamedParameters();30         setProperties(query, context, namedParams);31         return query;32     };33  private String findSQLByVelocity(String queryName, Context context) throws Exception {34         if (context == null)35             context = new VelocityContext();36         String sql = getSqlByName(queryName);37         StringWriter writer = new StringWriter();38         Velocity.evaluate(context, writer, "Hibernate", sql);39         sql = writer.toString();40         return sql;41     };42 protected String getSqlByName(String queryKey) {43         return statements.get(queryKey);44     }就这些。大家也许有更好的方法,欢迎交流。QQ:24889356QQ:24889356

0
1
分享到:
评论
4 楼 liwanfeng 2012-06-18  
从哪里粘过来的?怎么这么乱?
3 楼 wangxiao5530 2011-12-06  
同感
2 楼 bubuhui 2011-12-05  
luoyu-ds 写道
我表示你的文章排版,没几个人愿意看下去....

同感哦
1 楼 luoyu-ds 2011-12-05  
我表示你的文章排版,没几个人愿意看下去....

相关推荐

    weblogic12 下 org.hibernate.hql.ast.HqlToken

    ### WebLogic 12下org.hibernate.hql.ast.HqlToken冲突解决方案 在使用WebLogic 12部署应用程序时,可能会遇到与`org.hibernate.hql.ast.HqlToken`相关的异常问题。这种异常通常与Hibernate版本之间的不兼容性有关...

    hibernate-HQL语句大全

    hibernate-HQL语句大全

    Hibernate_HQL.rar_hibernate HQL_hibernate hql src

    对hibernate的hql进行了详尽的讲解

    Hibernate-HQL.rar_HQL_hibernate hql

    本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...

    Hibernate(HQL、QBC查询)源码

    Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码

    Hibernate-HQL语句多对多写法

    "Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...

    Hibernate hql查询语法总结

    《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...

    Hibernate的HQL讲解

    对Hibernate中HQL语句的讲解

    Hibernate的HQL查询

    hibernate hql 语法学习的文档

    hibernate 查询?Hibernate的HQL查询

    【标题】:深入理解Hibernate的查询机制:HQL查询 【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生...

    hibernate3-hql.jar

    hibernate3-hql.jar .

    hibernate的HQL的jar

    标题提到的“hibernate的HQL的jar”,实际上是指在使用Hibernate框架时,需要包含特定的Hibernate库文件,其中包含了对HQL支持的实现。这些jar文件通常包含在Hibernate的发行版中,它们提供了执行HQL查询所需的类和...

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    hibernate的HQL的模糊查询

    通过将用户输入的关键字转化为HQL的`like`表达式,可以实现动态的、灵活的模糊查询,提高用户体验。 五、注意事项 - 使用HQL模糊查询时,注意防止SQL注入,确保传入的参数是安全的。 - 大量的模糊查询可能导致性能...

    Hibernate 课件_HQL

    ### Hibernate 课件_HQL 知识点解析 #### HQL查询 - **定义**: HQL(Hibernate Query Language)是一种面向对象的查询语言,它的语法类似于SQL,但不同于直接操作数据库表,HQL操作的是持久化的Java对象。这意味着...

    hibernate_hql.rar_HQL

    七、HQL动态查询 在实际开发中,需求经常变化,因此动态构建HQL查询语句显得尤为重要。Hibernate提供`Criteria API`和`Querydsl`等工具,可以根据参数动态生成HQL,提高了代码的可维护性。 总之,Hibernate HQL是...

    hibernateHQL关联查询

    ### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...

    hibernate-HQL用例

    **hibernate-HQL用例** Hibernate 是一个强大的Java持久化框架,它简化了与关系数据库之间的交互。HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,类似于SQL,但更贴近Java对象的思维模式。...

Global site tag (gtag.js) - Google Analytics