如何让NHibernate只生成SQL而不执行它?

hom*_*ast 52 sql nhibernate fluent-nhibernate

我知道如何使用show_sql配置选项在运行时将SQL记录到log4net/NLog/trace窗口.

我正在寻找的是一种给Query<T>()NHibernate检索生成的SQL的方法.

我查看了Persister类,Drivers,不同的拦截器和事件.有很多地方可以看,即使缩小搜索范围也会有很大的帮助.

Ger*_*ard 97

您可以使用以下方法获取生成的SQL查询而不执行:

对于NHibernate.Linq查询:

public String GetGeneratedSql(System.Linq.IQueryable queryable, ISession session)
{
    var sessionImp = (ISessionImplementor) session;
    var nhLinqExpression = new NhLinqExpression(queryable.Expression, sessionImp.Factory);
    var translatorFactory = new ASTQueryTranslatorFactory();
    var translators = translatorFactory.CreateQueryTranslators(nhLinqExpression, null, false, sessionImp.EnabledFilters, sessionImp.Factory);

    return translators[0].SQLString;
}
Run Code Online (Sandbox Code Playgroud)

对于Criteria查询:

public String GetGeneratedSql(ICriteria criteria)
{
    var criteriaImpl = (CriteriaImpl) criteria;
    var sessionImpl = (SessionImpl) criteriaImpl.Session;
    var factory = (SessionFactoryImpl) sessionImpl.SessionFactory;
    var implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);
    var loader = new CriteriaLoader((IOuterJoinLoadable) factory.GetEntityPersister(implementors[0]), factory, criteriaImpl, implementors[0], sessionImpl.EnabledFilters);

    return loader.SqlString.ToString();
}
Run Code Online (Sandbox Code Playgroud)

对于QueryOver查询:

public String GetGeneratedSql(IQueryOver queryOver)
{
    return GetGeneratedSql(queryOver.UnderlyingCriteria);
}
Run Code Online (Sandbox Code Playgroud)

对于Hql查询:

public String GetGeneratedSql(IQuery query, ISession session)
{
    var sessionImp = (ISessionImplementor)session;
    var translatorFactory = new ASTQueryTranslatorFactory();
    var translators = translatorFactory.CreateQueryTranslators(query.QueryString, null, false, sessionImp.EnabledFilters, sessionImp.Factory);

    return translators[0].SQLString;
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法强制执行`GetGeneratedSql(ICriteria criteria)`来返回带有命名参数而不是占位符(`?`)的查询? (11认同)
  • 有没有办法扭转这种局面?,我的意思是生成SQLO字符串到QueryOver或实体? (2认同)
  • Nhibernate 4.0.4是否可以使用“ CreateQueryTranslators”更新?此方法进行了重大更改,签名现在有所不同。 (2认同)