2009-11-20 73 views

回答

2

由於HQL翻譯依賴於您的映射和運行時行爲,我認爲這是不太可能的靜態方法。

您可以針對真實數據庫運行HQL,並通過您的特定rdbms或NHProf的分析器捕獲生成的SQL。

+0

我正在使用MYSQL和NHProf。但它生成的SQL無法在數據庫中執行。 INSERT INTO Table1 (Column1,Column2,Column3,Column4,Column5) VALUES(?,?,?,?,?) – ranj 2009-11-22 07:17:51

+0

好吧,這只是一個參數化查詢,上面的某處必須是參數聲明和初始化。我很肯定NHProf支持複製和粘貼SQL。否則請在此處詢問: http://groups.google.com/group/nhprof – 2009-11-22 08:12:22

0

我不熟悉所有的參數,但是這似乎工作:

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

我不知道什麼樣的價值自動轉換HQL到SQL是動態...

你到底想要完成什麼?

最簡單的方法是在運行SQL Server Profiler的同時運行代碼以查看生成的SQL。但更好的方法是下載nhProf(www.nhprof.com)並將其用於您的代碼。您將能夠精確地看到您的代碼在SQL中輸出的內容,並且會對它進行格式化和顏色編碼,並且還會提供有關如何改進對nhibernate的使用的提示。

0

與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); 
    } 
} 
1

我的老培訓。這是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>