通过velocity模板和Hibernate sql-query的实现动态hql
来源:互联网 发布:ubuntu命令行复制文件 编辑:程序博客网 时间:2024/05/21 06:27
在开发的时候,很多时候都遇到过需要动态拼写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 <span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">zuidaima_com_users</span> Where 1=1 #if($name && $name.length() > 1) AND name =:name #end ]]> </query>在系统加载时,需要把配置文件加载到系统中。加载代码关键部分如下:
<pre code_snippet_id="257411" snippet_file_name="blog_20140326_2_5484192" name="code" class="java" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px;"> package com.zuidaima.utilpublic 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; } }
1 0
- 通过velocity模板和Hibernate sql-query的实现动态hql
- 通过velocity模板和Hibernate sql-query的实现动态hql
- 通过Velocity模板实现了Hibernate sql-query的动态(SQL/HQL)
- Hibernate Recursive Query(Hibernate 递归查询) HQL 递归的实现
- Hibernate 里 SQL 和 HQL,Criteria Query 对Session Cache缓存使用的不同
- query 中Hql和sql
- Hibernate中通过HQL/JPQL查询的方式实现动态数据获取
- Hibernate 的HQL SQL
- (HQL)Hibernate Query Lanaguage常用的语句
- HQL(Hibernate Query Language)
- Hibernate Query Language (HQL)
- HQL(Hibernate Query Language)
- Hibernate Query examples (HQL)
- hibernate高级查询之 HQL(Hibernate Query Language)和QBC(Query By Criteria)的分析与研究
- hibernate 使用 HQL 和 SQL
- 通过Hql、Sql生成Hibernate CountQuery 字符串
- day24 ORM Hibernate常用的接口和类(Configuration, SessionFactory , Session, Transaction ,Query) hql
- (2)hibernate HQL命名查询和Query接口的分页查询
- .Net解析JSON字符串
- unix c-金额类型转成英文大写
- 推荐几个好用且免费的SQLite图形化管理工具
- Insertion Sort List
- Axis2 SSL
- 通过velocity模板和Hibernate sql-query的实现动态hql
- 使用MessageFormat处理包含占位符的字符串
- 浮点型(float和double)
- PHP调用汇率源代码
- 升级到 Xcode5.1, iOS 7.1 之后,zxing 编译出错
- “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”
- eclipse中使用git
- SurfaceHolder.Callback
- ArrayList 和 Vector 比较