gpt4 book ai didi

.net - 如何在运行时在代码中获取NHibernate生成的SQL?

转载 作者:行者123 更新时间:2023-12-04 04:13:52 24 4
gpt4 key购买 nike

我知道您可以通过将NHibernate生成的SQL连接到log4net或通过管道将其输出到控制台(“show_sql”选项)来查看它,但是有什么方法可以在运行时以代码的形式获取生成的SQL吗?

我想做的是获取一个ICriteria对象(或IQuery)并将生成的SQL转储到屏幕或自定义日志(不是log4net)中。就像是...

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

可以做这样的事情吗?

编辑:由于 DanP在Java的 "Hibernate Criteria to SQL Translation"类中找到了出色的发现,因此在将其移植到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<String, IFilter>(),
factory);
translator.Compile(new Dictionary<String, String>(), false);
return translator.SQLString;
}

return null;
}
}

最佳答案

这是一篇描述如何从Hql或Hibernate中的条件获取基础sql的文章。我想将其移植为使用NHibernate不会太棘手:

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

关于.net - 如何在运行时在代码中获取NHibernate生成的SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com