NHibernate - How to log Named Parameterised Query

2019-08-08 14:12发布

问题:

I have a parameterised named Query like this :

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

I want to see the actual SQL query with parameters filled in. However while debugging I only get the following query:

Select * from my_assignment WHERE assignment_status in ( :assignmentStatus )

Why isn't the assignmentStatus being substituted for its real value?

回答1:

You may log each SQL to file with following code:

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;

You need to call this code once at startup of your application. Output log includes values of parameters as well.

This is implemented through Log4Net; you need to add reference. This logs both success and failed statements. You can play with FileAppender and Logger class to meet your additional requirements. This Q/A may also help.