- 热门文章:
- · 在查询页面中显示进度条,在数据load成功后隐去进度条
- · 一个stmt多个rs进行操作引起的ResultSet已经关闭错误
- · Eclipse + EclipseMe 下载与安装
- · Eclipse快速上手Hibernate--3. 利用XDoclet开发
- · 每个初学者都应该搞懂的问题!
- · 浅谈 Java 中 this 的使用
- · 使用内部和匿名类优化Java代码
- · hibernate连接sqlserver2000问题的解决(父子关系同时保存时发生 one-to-many & many-to-one)
- · 符合oo惯例的表现层控制 [曹晓钢]
- · [学习笔记]Thinking in Java (the 2nd edition) Study Note (4)
- · 从零开始学 Java (一) Hello World 左光 2005.4
- · TIJ阅读笔记(第十三章)
上一篇:让Hibern8IDE支持中文(2.1.2) >>
获得hibernate的sql语句(2.1.6)
获得hibernate的sql语句我们知道hibernate会将hql解析成sql,也许在某些时候,我们需要这些sql。不过hibernate的接口中没有公开的api,看来我们得自己行动了。1.开始前的工作 1.1 知道如何阅读javadoc api 1.2 知道如何使用ant编译hibernate源码包 1.3 hibernate源码包在hibernate压缩包的src目录,api文档在doc目录2.在执行Query.list()方法时,hibernate在控制台输出sql。从api文档中我们知道, Query接口有个实现类是net.sf.hibernate.impl.AbstractQueryImpl,但这个虚类中并没有实现list方法,继续查该类的子类net.sf.hibernate.impl.QueryImpl,呵呵,找到了。 list
public List list() throws HibernateException
Description copied from interface: Query Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].
Returns: the result list Throws: HibernateException3.查看net.sf.hibernate.impl.QueryImpl源代码,发现这里吧实现丢给了Session接口,看来我们得去找Session接口的麻烦。 public List list() throws HibernateException { verifyParameters(); Map namedParams = getNamedParams(); return getSession().find( bindParameterLists(namedParams), getQueryParameters(namedParams) );}4.接口是没有实现代码的,因此我们直接看实现类net.sf.hibernate.impl.SessionImple的源代码 public List find(String query, QueryParameters queryParameters) throws HibernateException {
if ( log.isTraceEnabled() ) { log.trace( "find: " + query ); queryParameters.traceParameters(factory); }
queryParameters.validateParameters();
QueryTranslator[] q = getQueries(query, false);
List results = Collections.EMPTY_LIST;
dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
//execute the queries and return all result lists as a single list try { for ( int i=0; i<q.length; i++ ) { List currentResults; try { currentResults = q[i].list(this, queryParameters); // 原来list是由这个类做的 } catch (SQLException sqle) { throw new JDBCException("Could not execute query", sqle); } currentResults.addAll(results); results = currentResults; } } finally { dontFlushFromFind--; } return results;}
5. 在api文档左下角All Classes框架搜索QueryTranslator,查到后点击查看api,嗯,有料。 getSQLString
public String getSQLString()
Description copied from class: Loader The SQL query string to be called; implemented by all subclasses
Specified by: getSQLString in class Loader6.但是我们并不想处理第4步中找到的find方法的QueryParameters参数,怎么办捏?参考一下其他find方法 private static final Object[] NO_ARGS = ArrayHelper.EMPTY_STRING_ARRAY;private static final Type[] NO_TYPES = ArrayHelper.EMPTY_TYPE_ARRAY;
/*** Retrieve a list of persistent objects using a hibernate query*/public List find(String query) throws HibernateException { return find(query, NO_ARGS, NO_TYPES); // 他交给了三个参数的接口 }
public List find(String query, Object value, Type type) throws HibernateException { return find( query, new Object[] { value }, new Type[] { type } ); // 又丢给另一个接口处理 }
public List find(String query, Object[] values, Type[] types) throws HibernateException { return find(query, new QueryParameters(types, values) ); // 回到2参数的接口手里了 :) }
7.开始修改,将第4步找到的代码复制出来更改如下,然后添加回SessionImpl类 public String[] getSQLStrings(String query) throws HibernateException { // 采用单参数接口处理queryParameters的方法 QueryParameters queryParameters = new QueryParameters(NO_ARGS, NO_TYPES); if ( log.isTraceEnabled() ) { log.trace( "find: " + query ); queryParameters.traceParameters(factory); }
queryParameters.validateParameters();
QueryTranslator[] q = getQueries(query, false);
String[] results = new String[q.length]; // 创建返回值
dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called
//execute the queries and return all result lists as a single list try { for ( int i=0; i<q.length; i++ ) { try { results[i] = q[i].getSQLString(); // 获得sql语句 :) } catch (SQLException sqle) { throw new JDBCException("Could not execute query", sqle); } } } finally { dontFlushFromFind--; } return results;}
8.给Session接口增加一个方法 public String[] getSQLStrings(String query) throws HibernateException;9.编译之后大功告成,我们可以使用Session.getSQLStrings(query)获得sql语句数组 :)
下一篇:在查询页面中显示进度条,在数据load成功后隐去进度条 >>
相关文章:
- · Java中new DerivedClass()时背后发生的事情
- · JSR 271, Mobile Information Device Profile 3 START!
- · J2ME学习——从模拟器到真机
- · J2ME学习——从WTK到厂商SDK
- · JSP实现树型组织架构(6)--包含文件connectinDB.jsp & orgConnInclude.jsp
- · Learn Spring in spring(四)
- · 使用JDBC创建数据库访问程序
- · 分页显示从数据库中读出的记录
- · 编程必备经典:Java常见问题集锦
- · Oracle & JSP 开发的小型信息管理系统 (七) 源代码5
- · Java Servlet Programming 读书笔记 - servlet生命周期
- · 用Swing作一个日历控制程序
- · 用Swing的Jtable类让数据看起来更干净
- · java虚拟机学习笔记
- · 详解J2EE的13种核心技术
- · Eclipse平台入门:开发环境与实例
- · 十分钟学习WEBGLOGIC6.1
- · 用数据库JDBC连接写法
- · Eclipse 3.0 上配置JSP开发环境
- · 仔细触摸Java编程中的“文档”和“包”
- · 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询
- · BEA调整战略再次突围
- · Tomcat5.0.19与oracle8.1.7连接池配置指南
- · An Overview of RMI Applications
- · Tomcat与Apache整合指南
- · JBuilder2005集成CVS开发指南
- · 正确、优雅的关闭weblogic 8
- · java exe 程序
- · 配置JDK / JAVA
- · Eclipse快速上手Hibernate--2. 利用Hbm映射文件开发
- · 避免繁复的get/set操作
- · Sitemesh学习[2]
- · Sitemesh学习[1]
- · Sitemesh学习[0]
- · SWT/Jface核心编程 一书目录
- · Struts作业指导手册
- · 整合PDF和Java技术
- · 修改IntelliJ IDEA中CVS插件以兼容其他cvs工具
