То, как получить NHibernate, генерировало SQL в коде во времени выполнения?

Я знаю, что можно просмотреть NHibernate, генерировал SQL путем сцепления его до log4net или передачи по каналу его к консоли ("show_sql" опция), но там какой-либо способ получить сгенерированный SQL в коде во времени выполнения?

То, что я хотел бы смочь сделать, является взятием объект ICriteria (или IQuery), и выведите сгенерированный SQL на экран или пользовательский журнал (не log4net). Что-то как...

var sql = criteria.GetGeneratedSql() // Wishful thinking

Что-то вроде этого может быть сделано?


Править: Благодаря превосходной находке DanP "В спящем режиме Критерии к классу" Перевода SQL для Java, я взял первую трещину при портировании этого к NHibernate. Кажется, работает на простые случаи, но определенно мог использовать некоторое улучшение (т.е. обработка ошибок, и т.д.)

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(), 
                factory);
            translator.Compile(new Dictionary(), false);
            return translator.SQLString;
        }

        return null;
    }
}

9
задан Community 23 May 2017 в 02:01
поделиться

2 ответа

Вот статья, описывающая, как получить базовый sql из hql или criteria в Hibernate; я полагаю, что перенести это на использование NHibernate не будет слишком сложно:

http://narcanti.keyboardsamurais.de/hibernate-criteria-to-sql-translation.html

5
ответ дан 3 November 2019 в 04:40
поделиться

Раньше я мог просматривать код, сгенерированный и отправленный в SQL в спящем режиме с помощью инструмента SQL Profiler. В зависимости от ваших целей, он может предоставить то, что вам нужно.

0
ответ дан 3 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: