2017-04-10 4 views
0

En tant que débutant dans HQL, j'ai une requête SQL que j'essaie de transformer en hql.Erreur de syntaxe 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; 

Donc HQL j'essaie ceci:

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; 

Mais je reçois une erreur de syntaxe sur la ligne CreateQuery.

Qu'est-ce que j'ai fait de mal?

Merci

+0

Même problème que dans cette [autre question] (/ q/42462497/1178314) de votre part! –

+0

Copie possible de [Comment transformer cette requête SQL native en HQL] (http://stackoverflow.com/questions/42462497/how-to-transform-this-native-sql-query-to-an-hql) –

Répondre

1

Bien que je considère cela comme un double de this other question from you, voici une réponse distincte, plus explicite ici.

ne prend pas en charge les sous-requêtes dans l'instruction from. (Il les prend en charge dans d'autres instructions, telles que les conditions where.) Vous devez réécrire votre requête sans la sous-requête dans le from.

Votre sous-requête semble être présente uniquement pour limiter le nombre de lignes. Supprimez la limite de ligne de la requête et utilisez plutôt .SetMaxResults(yourMaxRowCount) sur l'objet de requête HQL.

L'instruction de terminaison ; n'est pas nécessaire dans HQL, et je ne sais pas si elle est prise en charge. Je pense que ce n'est pas, mieux vaut l'enlever.

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

Cela devrait corriger le QuerySyntaxException. D'ailleurs, votre modèle d'utilisation de transaction n'est pas sûr. Lorsque vous utilisez des transactions à portée locale, placez-les toujours dans using pour vous assurer qu'elles sont correctement fermées.

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

Même en cas d'échec, la transaction sera alors toujours disposé, ce qui lui fait rollback si elle était encore en cours.

+0

J'ai en fait oublié cette autre question, mais j'essaierai d'éviter cela dans d'autres questions. Merci d'avoir pris le temps de répondre à ma question, j'apprécie beaucoup – napi15