【问题标题】:HQL to SQL converterHQL 到 SQL 转换器
【发布时间】:2009-11-20 06:58:05
【问题描述】:

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

【问题讨论】:

    标签: nhibernate hql


    【解决方案1】:

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

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

    【讨论】:

    • 我正在使用 MYSQL 和 NHProf。但它会生成无法对数据库执行的 SQL。 INSERT INTO Table1 (Column1,Column2,Column3,Column4,Column5) VALUES (?,?,?,?,?)
    • 嗯,这只是一个参数化查询,上面的某个地方一定是参数声明和初始化。我很确定 NHProf 支持复制和粘贴 SQL。否则在这里问:groups.google.com/group/nhprof
    【解决方案2】:

    我以前的训练。那是测试版。这里是! (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>
    

    【讨论】:

      【解决方案3】:

      我不熟悉所有参数,但这似乎可行:

      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);
      

      【讨论】:

        【解决方案4】:

        我不确定自动将 HQL 转换为 SQL 的价值是什么...

        你到底想通过这个来完成什么?

        最简单的方法是在运行 SQL Server Profiler 的同时运行代码以查看生成的 SQL。但更好的方法是下载 nhProf (www.nhprof.com) 并将其与您的代码一起使用。您将能够准确地看到您的代码在 SQL 中输出的内容,它将对其进行格式化和颜色编码,并为您提供有关改进 nhibernate 使用方法的提示。

        【讨论】:

          【解决方案5】:

          使用 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);
              }
          }
          

          【讨论】:

            【解决方案6】:

            这里是如何使用 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();
            }
            

            【讨论】:

              猜你喜欢
              • 2021-01-10
              • 2012-09-06
              • 1970-01-01
              • 2021-06-14
              • 2011-05-26
              • 1970-01-01
              • 1970-01-01
              • 2011-09-24
              相关资源
              最近更新 更多