- 浏览: 387189 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (285)
- test (0)
- 分类 (1)
- java (281)
- tttttttttttt (1)
- android程序复制数据库 (1)
- Hibernate 动态 HQL (1)
- java编写扑克的洗牌程序 (1)
- NIO 之 选择就绪模式 (1)
- wpo另类问题:不可轻视的蜘蛛爬行对服务器造成的负担 (1)
- haml (1)
- cvcvcvc (1)
- 开源史上最成功的8个开源产品 (1)
- XML文件转换成Word文件或者Excel文件 (1)
- 一些利用开源浏览器核心开发专用浏览器的连接 (1)
- 毛笔效果简单思路 (1)
- 年终考评以后 (1)
- RFC821 简单邮件传输协议(SMTP)中文定义文档 (1)
- JNI中jstring类型与c语言中的字符串的转换 (1)
- 极限编程(XP)的重构与设计模式 (1)
- MapInfo2005年第三期电子新闻 (1)
- 想到目前各BLOG站点和搜索引擎的一点点缺陷 (1)
- 成功通过DB2的700和701考试 (1)
- 基于记录登陆信息的防止网页暴力破解方法 (1)
- Router路由 (1)
- 终于稍微完整的学习了一下Linux (1)
- android手机通讯录备份还原代码 (1)
- Qt之美(一):d指针/p指针详解 (1)
- DB2 静默安装 (1)
- linux开机启动脚本的顺序 (1)
- Hibernate实体对象的三种状态 (1)
- Hibernate面向对象的hql语句 (1)
- ibatIS调用存储过程 (1)
- Linux启动过程(详细说明) (1)
- C3P0配置 (1)
- memcache安装 (1)
- js event.keyCode (1)
- java获取汉子首字母 (1)
- Eclipse GC log (1)
- java轻量级httpserver (1)
最新评论
-
smilea001:
我知道了,作者采用的是gbk编码,我采用的是utf-8编码,
java获取汉子首字母 -
smilea001:
我输入的也是--
java获取汉子首字母 -
di1984HIT:
写的不错啊。
Router路由 -
kaixinyou:
...
2011.07.20——— android 获得当前view在屏幕的坐标 -
zhengjianbo:
你好,可以将你的实现代码公布下吗!万分感谢!
毛笔效果简单思路
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 && $name.length() > 1) AND name =:name #end ]]> </query> <query name="selectUserHQL"> <![CDATA[ FROM users Where 1=1 #if($name && $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 && 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
评论
4 楼
liwanfeng
2012-06-18
从哪里粘过来的?怎么这么乱?
3 楼
wangxiao5530
2011-12-06
同感
2 楼
bubuhui
2011-12-05
luoyu-ds 写道
我表示你的文章排版,没几个人愿意看下去....
同感哦
1 楼
luoyu-ds
2011-12-05
我表示你的文章排版,没几个人愿意看下去....
发表评论
-
java轻量级httpserver
2012-02-08 11:48 1562httpclient+httpserver demo ... -
Eclipse GC log
2012-02-04 16:59 1393为了查看Eclipse GC log,需要在eclip ... -
java获取汉子首字母
2012-02-03 09:14 1518public class StringUtil { ... -
js event.keyCode
2012-02-03 09:09 1199<span style="" ... -
memcache安装
2012-02-02 12:04 1139? <blockquote> 1. ... -
C3P0配置
2012-02-02 11:34 978cquireIncrement[3] ... -
Linux启动过程(详细说明)
2012-02-01 09:09 1556<div class="post ... -
ibatIS调用存储过程
2012-01-31 15:38 1602<p>一、ibatIS调用存储过程(调用存 ... -
Hibernate面向对象的hql语句
2012-01-11 13:14 994Hibernate中hql条件语句的书写方式有: ? ... -
Hibernate实体对象的三种状态
2012-01-11 12:59 1269<p style="text- ... -
linux开机启动脚本的顺序
2011-12-21 15:14 1099下开机自动启动脚本所涉及的知识和方法、如下: ... -
DB2 静默安装
2011-12-21 11:59 1051<span style="color: ... -
Qt之美(一):d指针/p指针详解
2011-12-20 15:14 1943[/b]2011.11.16 [size=18px;] ... -
android手机通讯录备份还原代码
2011-12-20 11:54 2932<span style="font-f ... -
终于稍微完整的学习了一下Linux
2011-12-19 12:14 1164Linux以前也装过两次,不过几乎没去用。头几天看一些 ... -
Router路由
2011-12-19 10:54 1157Router路由:设定线的轨迹,在Connection ... -
基于记录登陆信息的防止网页暴力破解方法
2011-12-17 10:49 1430对黑客方面比较感兴趣的或者是比较熟悉的,应该知道溯雪这 ... -
成功通过DB2的700和701考试
2011-12-16 17:27 858嘿嘿,原以为比较没有信心的701考试也被俺成功的攻克了 ... -
想到目前各BLOG站点和搜索引擎的一点点缺陷
2011-12-15 15:54 872感觉无聊,就到中国博客网的首页逛了逛,想看看有没有什么 ... -
MapInfo2005年第三期电子新闻
2011-12-15 10:49 893<span lang="EN-US&q ...
相关推荐
weblogic12 下最新 org.hibernate.hql.ast.HqlToken解决办法
hibernate-HQL语句大全
hibernate查询之HQLhibernate查询之HQLhibernate查询之HQL
对hibernate的hql进行了详尽的讲解
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
一个关于Hibernate-HQL 的文档 内容实际而且实用
Hibernate hql查询语法总结 Hibernate hql查询语法总结
Hibernate_HQL大全
对Hibernate中HQL语句的讲解
hibernate hql 语言大全 hql学习,这个文档是一个很全面,很不错的
hibernate 中HQL语句查询学习笔记
hibernate3-hql.jar .
hibernate hql 语法学习的文档
hibernate的HQL的jar,对于应用hibernate框架进行开发时需要。
hibernate 的HQL 语言入门与提高
Hibernate查询语言HQL.PPT
Hibernate注解方式、HQL查询
Hibernate HQL 查询 Query 资料 3个word总结的资料。
Hibernate HQL基础练习小列子+数据库