作为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
行收到语法错误。
我做错了什么?
谢谢
答案 0 :(得分:1)
虽然我认为这是this other question from you的副本,但这里有一个单独的,更明确的答案。
hql不支持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;
}
即使出现故障,也会始终处理该交易,如果该交易仍在进行中,则会进行回滚。