NHibernate-如何使用参数值记录命名的参数化查询?

问题描述 投票:2回答:1

我有一个像这样的参数化查询:

Query moveOutQuery = session.createSQLQuery(moveOutQueryStr.toString())
                .addEntity(MyClass.class)
                .setParameter("assignmentStatus", Constants.CHECKED_OUT)

我想看到带有参数的实际SQL查询。但是,在调试时,我只得到以下查询:

Select * from my_assignment WHERE assignment_status in ( :assignmentStatus )

为什么assignmentStatus不能代替它的实际值?

nhibernate named-query parameterized-query
1个回答
0
投票

为什么不使用assignmentStatus替换其实际值?

这是因为NHibernate使用查询参数来输入值。在许多情况下,这非常有效,并且还可以防止SQL注入攻击。参数是单独发送的。如果按照以下说明记录了SQL,则可以在底部找到它们。


您可以使用以下代码将每个SQL记录到文件中:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();

FileAppender fileAppender = new FileAppender();
fileAppender.Name = "NHFileAppender";
fileAppender.File = logFilePath;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.Layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}:%m%n%n");
fileAppender.ActivateOptions();

Logger logger = hierarchy.GetLogger("NHibernate.SQL") as Logger;
logger.Additivity = false;
logger.Level = Level.Debug;
logger.AddAppender(fileAppender);

hierarchy.Configured = true;

您还需要在进行如下配置时设置ShowSql

configuration.SetProperty(NHibernate.Cfg.Environment.ShowSql, "true");
configuration.SetProperty(NHibernate.Cfg.Environment.FormatSql, "true");

您需要在应用程序启动时调用此代码一次。输出日志还包括参数值。记录的查询如下所示:

2019-12-26 14:13:07:
    SELECT
        this_.MyEntityID as myentityid1_0_0_,
        this_.MyProperty as myproperty2_0_0_ 
    FROM
        [TestDB].[dbo].MyEntity this_ 
    WHERE
        (
            this_.MyProperty = @p0
        );
    @p0 = 'filterValue' [Type: String (4000:0:0)]

如您所见,参数值filterValue列在底部。

这是通过log4net实现的;您需要添加参考。这将记录成功和失败的语句。您可以使用FileAppenderFileAppender类来满足您的其他要求。

也请参考Logger中的Logger。也可以找到更多详细信息PatternLayoutPatternLayoutdocumentationhereQ / A讨论相同。

下面的问题解答可能也会有所帮助:

© www.soinside.com 2019 - 2024. All rights reserved.