Sé que usted puede ver el SQL generado por NHibernate conectarlo a log4net o se conducirá a la consola (opción "show_sql"), pero ¿hay alguna manera de obtener el SQL generado en el código en tiempo de ejecución?¿Cómo obtener NHibernate SQL generado en código en tiempo de ejecución?
Lo que me gustaría hacer es tomar un objeto ICriteria (o IQuery) y volcar el SQL generado en la pantalla o el registro personalizado (no log4net). Algo como ...
var sql = criteria.GetGeneratedSql() // Wishful thinking
¿Se puede hacer algo como esto?
EDIT: Gracias a excelente hallazgo de una clase "Hibernate Criteria to SQL Translation" para Java DanP 's, me tomaron una primera grieta en portar este a NHibernate. Parece que funciona para los casos simples, pero sin duda podría mejorar (es decir, tratamiento de errores, etc.)
using NHibernate.Engine;
using NHibernate.Hql.Ast.ANTLR;
using NHibernate.Impl;
using NHibernate.Loader;
using NHibernate.Loader.Criteria;
using NHibernate.Persister.Entity;
public class HibernateHqlAndCriteriaToSqlTranslator
{
public HibernateHqlAndCriteriaToSqlTranslator() { }
public ISessionFactory SessionFactory { get; set; }
public string ToSql(ICriteria criteria)
{
var c = (CriteriaImpl) criteria;
var s = (SessionImpl)c.Session;
var factory = (ISessionFactoryImplementor)s.SessionFactory;
String[] implementors = factory.GetImplementors(c.EntityOrClassName);
var loader = new CriteriaLoader(
(IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),
factory,
c,
implementors[0],
s.EnabledFilters);
return ((OuterJoinLoader)loader).SqlString.ToString();
}
public string ToSql(string hqlQueryText)
{
if (!String.IsNullOrEmpty(hqlQueryText))
{
var translatorFactory = new ASTQueryTranslatorFactory();
var factory = (ISessionFactoryImplementor) this.SessionFactory;
var translator = translatorFactory.CreateQueryTranslator(
hqlQueryText,
hqlQueryText,
new Dictionary<String, IFilter>(),
factory);
translator.Compile(new Dictionary<String, String>(), false);
return translator.SQLString;
}
return null;
}
}
http: //stackoverflow.com/questions/10704462/how-can-i-have-nhibernate-only-generate-the-sql-without-executing-it –