【发布时间】:2009-11-20 06:58:05
【问题描述】:
有人知道如何将 NHibernate HQL 转换为 SQL 脚本吗?
【问题讨论】:
标签: nhibernate hql
有人知道如何将 NHibernate HQL 转换为 SQL 脚本吗?
【问题讨论】:
标签: nhibernate hql
由于 HQL 转换取决于您的映射以及运行时行为,我认为不太可能有静态方法。
您可以针对真实数据库运行 HQL,并通过针对特定 rdbms 或 NHProf 的分析器捕获生成的 SQL。
【讨论】:
我以前的训练。那是测试版。这里是! (hql2sql.jsp)
<SCRIPT type="text/javascript">
<%
org.hibernate.Session ThisSession = SessionFactory.getSession();
org.hibernate.engine.SessionImplementor ThisSessionImplementor = (org.hibernate.engine.SessionImplementor) ThisSession;
org.hibernate.engine.SessionFactoryImplementor ThisSessionFactory = (org.hibernate.engine.SessionFactoryImplementor) ThisSession.getSessionFactory();
String HQL_Query = "SELECT ... ";
String SQL_Query;
try{
org.hibernate.engine.query.HQLQueryPlan HQL_Query_Plan = new org.hibernate.engine.query.HQLQueryPlan(HQL_Query, true, ThisSessionImplementor.getEnabledFilters(), ThisSessionFactory);
SQL_Query = org.apache.commons.lang.StringUtils.join(HQL_Query_Plan.getSqlStrings(), ";");
}catch(Exception e){SQL_Query = "ERROR!! :: " + e.getMessage();}
%>
$(document).ready(function(){
$('span[role="HQL"]').text(" <%=HQL_Query%>");
$('span[role="SQL"]').text(" <%=SQL_Query%>");
});
</SCRIPT>
<div style="border:2px solid brown">
Ваш запрос на HQL:
<br/><br/><span role="HQL"> </span>
</div>
<br>
<div style="border:2px solid green">
Ваш запрос на SQL:
<br/><br/><span role="SQL"> </span>
</div>
【讨论】:
我不熟悉所有参数,但这似乎可行:
ISessionFactory sessionFactory = ...
var sf = (SessionFactoryImpl) sessionFactory;
var hql = "from Person";
var qt = sf.Settings.QueryTranslatorFactory.CreateQueryTranslator("", hql, new Dictionary<string, IFilter>(), (ISessionFactoryImplementor) sessionFactory);
qt.Compile(new Dictionary<string, string>(), true);
var sql = qt.SQLString;
Console.WriteLine(sql);
【讨论】:
我不确定自动将 HQL 转换为 SQL 的价值是什么...
你到底想通过这个来完成什么?
最简单的方法是在运行 SQL Server Profiler 的同时运行代码以查看生成的 SQL。但更好的方法是下载 nhProf (www.nhprof.com) 并将其与您的代码一起使用。您将能够准确地看到您的代码在 SQL 中输出的内容,它将对其进行格式化和颜色编码,并为您提供有关改进 nhibernate 使用方法的提示。
【讨论】:
使用 NHibernate 3.2,这似乎是从 HQL 查询中获取 SQL 的最简单方法:
private string GetSQL(string hql)
{
using (var iSession = ...)
{
var session = (NHibernate.Engine.ISessionImplementor)iSession;
var sf = (NHibernate.Engine.ISessionFactoryImplementor)iSession.SessionFactory;
var sql = new NHibernate.Engine.Query.HQLStringQueryPlan(hql, true, session.EnabledFilters, sf);
return string.Join(";", sql.SqlStrings);
}
}
【讨论】:
这里是如何使用 NH 5.2(参见 https://stackoverflow.com/a/55542462/2047306)
public static string HqlToSql(string hql, ISession session)
{
var sessionImp = (ISessionImplementor)session;
var translatorFactory = new ASTQueryTranslatorFactory();
var translators = translatorFactory.CreateQueryTranslators(new NHibernate.Hql.StringQueryExpression(hql),
null, false, sessionImp.EnabledFilters, sessionImp.Factory);
var hqlSqlGenerator = new HqlSqlGenerator(((QueryTranslatorImpl)translators[0]).SqlAST, sessionImp.Factory);
hqlSqlGenerator.Generate();
return hqlSqlGenerator.Sql.ToString();
}
【讨论】: