分享
 
 
 

获得hibernate的sql语句(2.1.6)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

获得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,呵呵,找到了。 listpublic 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: HibernateException

3.查看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,嗯,有料。 getSQLStringpublic String getSQLString()

Description copied from class: Loader The SQL query string to be called; implemented by all subclasses

Specified by: getSQLString in class Loader

6.但是我们并不想处理第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语句数组 :)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有