获得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 HibernateExceptionDescription 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 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;
}
public String getSQLString()Description copied from class: Loader The SQL query string to be called; implemented by all subclasses
Specified by: getSQLString in class Loader/**
* 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参数的接口手里了 :)
}
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;
}
本文地址:http://com.8s8s.com/it/it10401.htm