我有一个像这样的参数化查询:
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
不能代替它的实际值?
为什么不使用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实现的;您需要添加参考。这将记录成功和失败的语句。您可以使用FileAppender
和FileAppender
类来满足您的其他要求。
也请参考Logger
中的Logger
。也可以找到更多详细信息PatternLayout
,PatternLayout
和documentation。hereQ / A讨论相同。
下面的问题解答可能也会有所帮助: