Getting the SQL for HQL and Criteria Queries
OK, so, I already showed how we can get the SQL that was generated from a LINQ query. Of course, we can do the same for both HQL and Criteria APIs as well (QueryOver is just a wrapper around Criteria, mind you).
So, for HQL (and SQL), it goes like this:
1: public static class QueryExtensions
2: {
3: private static readonly PropertyInfo sessionProperty = typeof (QueryImpl).GetProperty("Session", BindingFlags.NonPublic | BindingFlags.Instance);
4:
5: public static String ToSql(this IQuery query)
6: {
7: if (query is QueryImpl)
8: {
9: var session = sessionProperty.GetValue(query, null) as ISession;
10: var sessionImpl = session.GetSessionImplementation();
11: var translatorFactory = new ASTQueryTranslatorFactory();
12: var translators = translatorFactory.CreateQueryTranslators(query.QueryString, null, false, sessionImpl.EnabledFilters, sessionImpl.Factory);
13:
14: return translators[0].SQLString;
15: }
16: else if (query is SqlQueryImpl)
17: {
18: return (query.QueryString);
19: }
20:
21: throw (new NotSupportedException("Query type is not supported."));
22: }
23: }
You can pass any implementation if IQuery, such as one produced from ISession.CreateQuery() or ISession.CreateSQLQuery(). The static field is merely for performance reasons.
As for Criteria:
1: public static class CriteriaExtensions
2: {
3: public static String ToSql(this ICriteria criteria)
4: {
5: var criteriaImpl = criteria as CriteriaImpl;
6: var sessionImpl = criteriaImpl.Session;
7: var factory = sessionImpl.Factory;
8: var implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);
9: var loader = new CriteriaLoader(factory.GetEntityPersister(implementors[0]) as IOuterJoinLoadable, factory, criteriaImpl, implementors[0], sessionImpl.EnabledFilters);
10:
11: return loader.SqlString.ToString();
12: }
13: }
And finally, QueryOver, just a small wrapper around the Criteria version:
1: public static class QueryOverExtensions
2: {
3: public static String ToSql(this IQueryOver queryOver)
4: {
5: var criteria = queryOver.UnderlyingCriteria;
6: return (criteria.ToSql());
7: }
8: }
Hope you find this useful!