2017-04-10 48 views
0

作爲HQL的初學者,我有一個SQL查詢,我試圖轉換成hql。HQL語法錯誤:'NHibernate.Hql.Ast.ANTLR.QuerySyntaxException'

select * from (

   select * 
   from CORRELATION_VUE 
   where film = v_oldidfilm and FILM2 not in (
                           select c.idfilm 
                           from cotes c 
                           where idclient = v_idclient) 
   order by CORRELATION desc 
  
 ) 
 where rownum <= 3; 

所以在HQL我想這一點:

ISession s = NHibernateHelper.GetCurrentSession(); 
ITransaction tx = s.BeginTransaction(); 
IQuery query = s.CreateQuery(
    @"select u from (
      select u from vueCorreliser u 
       where u.film = :idfilm 
        and u.FILM2 not in (
         select c.idfilm from cote c 
          where c.idclient = :idclient) 
       order by u.CORRELATION desc) 
     where rownum <= 3; ") 
    .SetInt32("idfilm", idfilm) 
    .SetInt32("idclient", idclient); 

IList<Film> result = query.List<Film>(); 
tx.Commit(); 
return result; 

但我對CreateQuery線路接收語法錯誤。

我做錯了什麼?

謝謝

+0

同樣的麻煩,比你在這[其他問題](/ q/42462497/1178314)! –

+0

[如何將此原生SQL查詢轉換爲HQL]可能的重複(http://stackoverflow.com/questions/42462497/how-to-transform-this-native-sql-query-to-an-hql) –

回答

1

雖然我認爲這是一個的this other question from you重複,這裏是一個獨立的,更加明確的答案在這裏。

不支持from語句中的子查詢。 (它在其他語句中支持它們,例如在where條件中。)您必須重寫查詢而不使用from中的子查詢。

你的子查詢似乎只存在於限制行數。刪除查詢中的行限制,改爲在HQL查詢對象上使用.SetMaxResults(yourMaxRowCount)

HQL中的終止語句;不需要,我不知道它是否受支持。我認爲不是,最好刪除它。

var query = s.CreateQuery(
    @"select u from vueCorreliser u 
     where u.film = :idfilm 
      and u.FILM2 not in (
       select c.idfilm from cote c 
        where c.idclient = :idclient) 
     order by u.CORRELATION desc") 
    .SetInt32("idfilm", idfilm) 
    .SetInt32("idclient", idclient) 
    .SetMaxResults(4); 

這應該修復QuerySyntaxException

順便說一下,您的交易使用模式並不安全。在使用本地作用域事務時,總是將它們嵌套在using中以確保它們正確關閉。

using (var tx = session.BeginTransaction()) 
{ 
    ... 
    tx.Commit(); 
    return result; 
} 

即使在發生故障的情況下,交易也會一直處置,這將導致它在還在進行時回滾。

+0

我其實已經忘記了另外一個問題,但會試圖避免這個問題。感謝您花時間回答我的問題,我非常感謝 – napi15