HQL到SQL转换器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HQL到SQL转换器相关的知识,希望对你有一定的参考价值。

有谁知道如何将NHibernate HQL转换为SQL脚本?

答案

由于HQL转换取决于您的映射以及运行时行为,因此我认为不太可能有静态方法。

您可以针对真实数据库运行HQL,并通过特定rdbms或NHProf的分析器捕获生成的SQL。

另一答案

我以前的训练。那是beta版本。这里是! (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">&nbsp;</span>
</div>
<br>
<div style="border:2px solid green">
    Ваш запрос на SQL:
    <br/><br/><span role="SQL">&nbsp;</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();
}

以上是关于HQL到SQL转换器的主要内容,如果未能解决你的问题,请参考以下文章

sql到hql抛出异常

条件查询,SQL,JPQL,HQL

如何以编程方式将 HQL 转换为 SQL 查询(不记录)

如何将任何给定的 SQL/HQL 选择查询动态转换为等效计数查询?

sql 日期转换代码片段 - Dato,120,konvertere

hibernate hql查询 与Criteria 查询语句区别和效率