HQL语法错误:'NHibernate.Hql.Ast.ANTLR.QuerySyntaxException'

时间:2017-04-10 22:02:32

标签: sql oracle nhibernate hql

作为HQL的初学者,我有一个SQL查询,我正在尝试转换为hql。

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行收到语法错误。

我做错了什么?

谢谢

1 个答案:

答案 0 :(得分: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;
}

即使出现故障,也会始终处理该交易,如果该交易仍在进行中,则会进行回滚。