получить запрос SQL из критериев NHibernate, прежде чем критерии будут выполнены - PullRequest
3 голосов
/ 14 марта 2012

У меня есть критерий NHibernate, из которого мне нужно получить SQL-запрос.Я попробовал различные методы из здесь .Тем не менее, запрос, который я получаю, не содержит параметров (вместо него вместо него стоит «?», Как упомянуто выше здесь и здесь ).Кроме того, по крайней мере, одна вещь, которая не работает, это crit.setMaxResults (n).

Я также пробовал перехватчики NHibernate.Однако запрос, который я получаю в OnPrepareStatement (sql), также не имеет параметров.Есть ли другой способ получить SQL-запрос из критериев?

PS: - Критерии создаются в первую очередь, поскольку с ними проще работать для сложных бизнес-задач.Тем не менее, мне нужно сделать экспорт данных, что очень медленно по критериям.Я пытаюсь получить запрос из критериев, а затем выполнить экспорт BCP из этого.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

с помощью регистратора, настроенного перед выполнением кода

var sqlLogger = (Logger)LogManager.GetRepository().GetLogger("NHibernate.SQL");
_sqlappender = new NhSqlAppender();
sqlLogger.AddAppender(_sqlappender);
if (!sqlLogger.IsEnabledFor(Level.Debug))
    sqlLogger.Level = Level.Debug;

class NhSqlAppender : AppenderSkeleton
{
    private List<string> queries = new List<string>(1000);

    public IList<string> Queries
    {
        get { return queries; }
    }

    protected override void Append(LoggingEvent loggingEvent)
    {
        queries.Add(loggingEvent.RenderedMessage);
    }
}

как ввести неиспользуемое соединение

class FakeConnectionFactory : DriverConnectionProvider
{
    public override IDbConnection GetConnection()
    {
        return new FakeConnection(base.GetConnection());
    }
}

class FakeConnection : DbConnection
{
    private IDbConnection _connection;

    public FakeConnection(IDbConnection connection)
    {
        _connection = connection;
    }

    ...

    protected override DbCommand CreateDbCommand()
    {
        return new FakeCommand(_connection.CreateCommand());
    }
}

class FakeCommand : DbCommand
{
    private IDbCommand iDbCommand;

    public FakeCommand(IDbCommand iDbCommand)
    {
        this.iDbCommand = iDbCommand;
    }

    ...

    protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
    {
        return EmptyDataReader();
    }

    public override int ExecuteNonQuery()
    {
        return 0;
    }

    public override object ExecuteScalar()
    {
        return 0;
    }
}
1 голос
/ 22 ноября 2018

Я думаю, что этот метод расширения сделает то, что вы ищете

  public static String ToSql(this ICriteria criteria)
    {
        var criteriaImpl = criteria as CriteriaImpl;
        var sessionImpl = criteriaImpl.Session;
        var factory = sessionImpl.Factory;
        var implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);
        var loader = new CriteriaLoader(factory.GetEntityPersister(implementors[0]) as IOuterJoinLoadable, factory, criteriaImpl, implementors[0], sessionImpl.EnabledFilters);

        return loader.SqlString.ToString();
    }
1 голос
/ 31 мая 2012

Чтобы ответить на вопрос самостоятельно, я думаю, что невозможно получить полный запрос со всеми параметрами, так как параметры добавляются повсеместно.Кроме того, существуют и другие проблемы, связанные с несколькими методами, например, в случае использования критерия присоединения к Walker setMaxResults не работает и может привести к критическим изменениям в nhibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...