在开发的时候,很多时候都遇到过需要动态拼写SQL,有的是在配置文件中写SQL,有的是在Java代码中拼写SQL,以配置文件拼SQL的可以拿IBatis为代表,但是很多时候是使用Hibernate的,这个时候就想要是Hibernate能像IBatis那样写就好了。
原创不易,转载请注明出处:通过velocity模板和Hibernate sql-query的实现动态hql
代码下载:http://www.zuidaima.com/share/1723627800005632.htm
这个时候就想到了模板语言和配置文件的结合。模板引擎可以选择Velocity,简单而不失强大,配置文件可以模仿Hibernate的sql-query 的XML文件。
Sql-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 zuidaima_com_user Where 1=1 #if($name && $name.length() > 1) AND name =:name #end ]]> </query> <query name="selectUserHQL"> <![CDATA[ FROM zuidaima_com_users Where 1=1 #if($name && $name.length() > 1) AND name =:name #end ]]> </query>
在系统加载时,需要把配置文件加载到系统中。加载代码关键部分如下:
package com.zuidaima.util public class DynamicHibernateImpl implements InitializingBean, ResourceLoaderAware, ApplicationContextAware{ public void afterPropertiesSet() throws Exception { for (int i = 0; i < fileNames.size(); i++) { String fileName = ((String) fileNames.get(i)).trim(); if (resourceLoader instanceof ResourcePatternResolver) { try { Resource[] resources= ((ResourcePatternResolver) resourceLoader).getResources(fileName); buildHQLMap(resources); } catch (IOException ex) { throw new Exception("Could not resolve sql definition resource pattern [" + fileName + "]", ex); } } else { Resource resource = resourceLoader.getResource(fileName); buildHQLMap(new Resource[] { resource }); } } } protected void buildHQLMap(Resource[] resources) throws Exception { for (int i = 0; i < resources.length; i++) { buildHQLMap(resources[i]); } } private void buildHQLMap(Resource resource) throws Exception { try { InputSource inputSource = new InputSource(resource.getInputStream()); org.w3c.dom.Document doc = this.documentLoader.loadDocument(inputSource, null, null, org.springframework.util.xml.XmlValidationModeDetector.VALIDATION_NONE, false); Element root = doc.getDocumentElement(); List<Element> querys = DomUtils.getChildElements(root); for(Element query:querys){ String queryName = query.getAttribute("name"); if (StringUtils.isEmpty(queryName)) { throw new Exception("DynamicHibernate Service : name is essential attribute in a <query>."); } if(statements.containsKey(queryName)){ throw new Exception("DynamicHibernate Service : duplicated query in a <query>."+queryName); } statements.put(queryName, DomUtils.getTextValue(query)); } } catch (SAXParseException se) { throw se; } catch (IOException ioe) { throw ioe; } }
相关推荐
通过Velocity,我们可以将HQL查询的结果动态地插入到模板中,生成动态页面。 将Hibernate HQL与Velocity结合使用,通常包括以下几个步骤: 1. **执行HQL查询**:在Java代码中,使用`Session`对象的`createQuery()`...
Velocity模板语言(VTL)简洁易用,通过$和#符号来调用变量和控制结构。 2. **Spring**:Spring是Java企业级应用开发的主流框架,提供了依赖注入(DI)、面向切面编程(AOP)、事务管理等核心功能。Spring的IoC容器...
Spring MVC、Hibernate 和 Velocity 是三个在Java开发中广泛使用的开源框架,它们分别专注于Web应用程序的模型-视图-控制器(MVC)架构、对象关系映射(ORM)以及模板引擎。下面将详细介绍这三个框架以及它们整合...
- **HQL和QBC**:Hibernate Query Language (HQL) 是面向对象的查询语言,类似SQL。Criteria API(Query By Criteria)提供了另一种方式构建动态查询。 - **缓存机制**:支持一级缓存和二级缓存,提高性能,减少...
它还提供了Criteria查询、HQL(Hibernate Query Language)等高级查询方式,增强了数据操作的灵活性。 **Spring** 框架是Java企业级应用的核心,它不仅仅是一个简单的MVC框架,而是提供了全面的解决方案,包括依赖...
- **HQL(Hibernate Query Language)**:Hibernate特有的查询语言,类似于SQL,但更加面向对象。 4. **Velocity模板引擎**: - **模板语法**:Velocity使用#和$符号进行指令和变量引用,例如#{if}条件判断,${...
Hibernate3引入了HQL(Hibernate Query Language),类似于SQL,但面向对象。它还提供了Criteria查询、SessionFactory和Session接口,提高了数据操作的效率和灵活性。 4. **Velocity**:Velocity是一个用于生成动态...
- **模板技术**:支持FreeMarker、Velocity等模板引擎,方便生成动态视图。 3. **Hibernate3.2**: - **对象关系映射(ORM)**:Hibernate是Java领域中最流行的ORM框架之一,它将数据库表映射为Java类,简化了...
5. **查询语言HQL**:Hibernate Query Language是面向对象的查询语言,类似于SQL,但更易于理解和使用。 6. **Criteria API**:提供了一种动态构建查询的API,使得在运行时构建复杂的查询成为可能。 当这两个框架...
HibernateJar包包含了Hibernate的核心API,如Session、SessionFactory、Query等,以及JPA支持和HQL(Hibernate Query Language)等。通过配置文件,开发者可以定义实体类和数据库表之间的映射关系,实现数据的自动...
它支持HQL(Hibernate Query Language),一种类似于SQL的语言,使查询更加便捷。在论坛系统中,Hibernate 可能用于管理用户信息、帖子、评论等数据的持久化。 **Spring** 框架是Java企业级应用的核心组件,它提供...
Hibernate还提供了HQL(Hibernate Query Language),一种面向对象的查询语言,与SQL类似但更贴近Java对象。 Velocity是一个快速、简单且强大的模板引擎,它的目标是使开发者能够专注于内容,而不是HTML布局。在...
Struts2集成了许多其他框架和库,如Freemarker和Velocity模板引擎,OGNL表达式语言,以及拦截器(Interceptor)机制,使得开发者能够实现复杂的应用逻辑。 在SSHAPI的CHM文件中,你将找到这三个框架的详细API文档,...
- **查询语言**:Hibernate提供了HQL(Hibernate Query Language)和Criteria API,使得数据查询更加灵活和强大。 - **缓存机制**:Hibernate支持二级缓存,可以显著提高应用程序的性能。 - **事务管理**:Hibernate...
在Hibernate中,它用于解析HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)。 7. **velocity-1.5.jar**:Velocity是一个基于Java的模板引擎,常用于生成动态网页内容。在Hibernate中,...
- **HQL(Hibernate Query Language)**:Hibernate 提供了自己的查询语言,类似于SQL,用于在Java代码中对数据库进行操作。 3. **整合Struts2和Hibernate**: - **数据访问对象(DAO)**:在业务逻辑层,通常会...
通过Criteria、HQL(Hibernate Query Language)或JPQL(Java Persistence Query Language),开发者可以方便地进行复杂查询。 在BBS论坛项目中,Struts2和Hibernate协同工作,为用户提供高效、稳定的服务。例如,...
它具有强大的查询语言HQL(Hibernate Query Language)和 Criteria API,能更灵活地进行数据库查询。 **Velocity模板引擎**: Velocity是Apache软件基金会的一个开源项目,它是一个轻量级的Java模板引擎,用于生成...
- Hibernate支持HQL(Hibernate Query Language),提供面向对象的查询方式,同时也支持SQL原生查询。 - 它提供了一对一、一对多、多对多等各种关系映射以及缓存机制,提高了数据访问效率。 4. **Oracle数据库**...
它还提供了查询语言HQL(Hibernate Query Language),与SQL类似但更面向对象,可以方便地进行复杂的数据库查询。 **网上书店系统实现** 结合Struts2和Hibernate3,可以构建出高效且易于维护的网上书店系统。系统的...