How to get SQL from Hibernate Criteria API (*not* for logging) How to get SQL from Hibernate Criteria API (*not* for logging) sql sql

How to get SQL from Hibernate Criteria API (*not* for logging)


Here's "another" way to get the SQL :

CriteriaImpl criteriaImpl = (CriteriaImpl)criteria;SessionImplementor session = criteriaImpl.getSession();SessionFactoryImplementor factory = session.getFactory();CriteriaQueryTranslator translator=new CriteriaQueryTranslator(factory,criteriaImpl,criteriaImpl.getEntityOrClassName(),CriteriaQueryTranslator.ROOT_SQL_ALIAS);String[] implementors = factory.getImplementors( criteriaImpl.getEntityOrClassName() );CriteriaJoinWalker walker = new CriteriaJoinWalker((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),                         translator,                        factory,                         criteriaImpl,                         criteriaImpl.getEntityOrClassName(),                         session.getLoadQueryInfluencers()   );String sql=walker.getSQLString();


I've done something like this using Spring AOP so I could grab the sql, parameters, errors, and execution time for any query run in the application whether it was HQL, Criteria, or native SQL.

This is obviously fragile, insecure, subject to break with changes in Hibernate, etc, but it illustrates that it's possible to get the SQL:

CriteriaImpl c = (CriteriaImpl)query;SessionImpl s = (SessionImpl)c.getSession();SessionFactoryImplementor factory = (SessionFactoryImplementor)s.getSessionFactory();String[] implementors = factory.getImplementors( c.getEntityOrClassName() );CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),    factory, c, implementors[0], s.getEnabledFilters());Field f = OuterJoinLoader.class.getDeclaredField("sql");f.setAccessible(true);String sql = (String)f.get(loader);

Wrap the entire thing in a try/catch and use at your own risk.


For those using NHibernate, this is a port of [ram]'s code

public static string GenerateSQL(ICriteria criteria)    {        NHibernate.Impl.CriteriaImpl criteriaImpl = (NHibernate.Impl.CriteriaImpl)criteria;        NHibernate.Engine.ISessionImplementor session = criteriaImpl.Session;        NHibernate.Engine.ISessionFactoryImplementor factory = session.Factory;        NHibernate.Loader.Criteria.CriteriaQueryTranslator translator =             new NHibernate.Loader.Criteria.CriteriaQueryTranslator(                factory,                 criteriaImpl,                 criteriaImpl.EntityOrClassName,                 NHibernate.Loader.Criteria.CriteriaQueryTranslator.RootSqlAlias);        String[] implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);        NHibernate.Loader.Criteria.CriteriaJoinWalker walker = new NHibernate.Loader.Criteria.CriteriaJoinWalker(            (NHibernate.Persister.Entity.IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),                                translator,                                factory,                                criteriaImpl,                                criteriaImpl.EntityOrClassName,                                session.EnabledFilters);        return walker.SqlString.ToString();    }