- 浏览: 394684 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 1604httpclient+httpserver demo ... -
Eclipse GC log
2012-02-04 16:59 1443为了查看Eclipse GC log,需要在eclip ... -
java获取汉子首字母
2012-02-03 09:14 1545public class StringUtil { ... -
js event.keyCode
2012-02-03 09:09 1232<span style="" ... -
memcache安装
2012-02-02 12:04 1179? <blockquote> 1. ... -
C3P0配置
2012-02-02 11:34 1012cquireIncrement[3] ... -
Linux启动过程(详细说明)
2012-02-01 09:09 1602<div class="post ... -
ibatIS调用存储过程
2012-01-31 15:38 1626<p>一、ibatIS调用存储过程(调用存 ... -
Hibernate面向对象的hql语句
2012-01-11 13:14 1020Hibernate中hql条件语句的书写方式有: ? ... -
Hibernate实体对象的三种状态
2012-01-11 12:59 1294<p style="text- ... -
linux开机启动脚本的顺序
2011-12-21 15:14 1146下开机自动启动脚本所涉及的知识和方法、如下: ... -
DB2 静默安装
2011-12-21 11:59 1081<span style="color: ... -
Qt之美(一):d指针/p指针详解
2011-12-20 15:14 2016[/b]2011.11.16 [size=18px;] ... -
android手机通讯录备份还原代码
2011-12-20 11:54 2962<span style="font-f ... -
终于稍微完整的学习了一下Linux
2011-12-19 12:14 1194Linux以前也装过两次,不过几乎没去用。头几天看一些 ... -
Router路由
2011-12-19 10:54 1200Router路由:设定线的轨迹,在Connection ... -
基于记录登陆信息的防止网页暴力破解方法
2011-12-17 10:49 1452对黑客方面比较感兴趣的或者是比较熟悉的,应该知道溯雪这 ... -
成功通过DB2的700和701考试
2011-12-16 17:27 881嘿嘿,原以为比较没有信心的701考试也被俺成功的攻克了 ... -
想到目前各BLOG站点和搜索引擎的一点点缺陷
2011-12-15 15:54 898感觉无聊,就到中国博客网的首页逛了逛,想看看有没有什么 ... -
MapInfo2005年第三期电子新闻
2011-12-15 10:49 931<span lang="EN-US&q ...
相关推荐
### WebLogic 12下org.hibernate.hql.ast.HqlToken冲突解决方案 在使用WebLogic 12部署应用程序时,可能会遇到与`org.hibernate.hql.ast.HqlToken`相关的异常问题。这种异常通常与Hibernate版本之间的不兼容性有关...
hibernate-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语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
对Hibernate中HQL语句的讲解
hibernate hql 语法学习的文档
【标题】:深入理解Hibernate的查询机制:HQL查询 【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生...
hibernate3-hql.jar .
标题提到的“hibernate的HQL的jar”,实际上是指在使用Hibernate框架时,需要包含特定的Hibernate库文件,其中包含了对HQL支持的实现。这些jar文件通常包含在Hibernate的发行版中,它们提供了执行HQL查询所需的类和...
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
通过将用户输入的关键字转化为HQL的`like`表达式,可以实现动态的、灵活的模糊查询,提高用户体验。 五、注意事项 - 使用HQL模糊查询时,注意防止SQL注入,确保传入的参数是安全的。 - 大量的模糊查询可能导致性能...
### Hibernate 课件_HQL 知识点解析 #### HQL查询 - **定义**: HQL(Hibernate Query Language)是一种面向对象的查询语言,它的语法类似于SQL,但不同于直接操作数据库表,HQL操作的是持久化的Java对象。这意味着...
七、HQL动态查询 在实际开发中,需求经常变化,因此动态构建HQL查询语句显得尤为重要。Hibernate提供`Criteria API`和`Querydsl`等工具,可以根据参数动态生成HQL,提高了代码的可维护性。 总之,Hibernate HQL是...
### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...
**hibernate-HQL用例** Hibernate 是一个强大的Java持久化框架,它简化了与关系数据库之间的交互。HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,类似于SQL,但更贴近Java对象的思维模式。...