Hibernate 如何在hql中使用从选择更新?
我试过这个:Hibernate 如何在hql中使用从选择更新?,hibernate,postgresql,nhibernate,hql,Hibernate,Postgresql,Nhibernate,Hql,我试过这个: using (var s = HibernateSessionFactory.OpenStatelessSession()) s.CreateQuery( @"UPDATE Guild as gg SET gg.PersistentXPSum = el.XPSum WHERE gg.Id=el.GuildId FROM (SELECT SUM(XP) AS XPSum,
using (var s = HibernateSessionFactory.OpenStatelessSession())
s.CreateQuery(
@"UPDATE Guild as gg SET gg.PersistentXPSum = el.XPSum
WHERE gg.Id=el.GuildId FROM
(SELECT SUM(XP) AS XPSum, GuildId FROM User
WHERE GuildId != null GROUP BY GuildId
ORDER BY XPSum desc LIMIT 50) el").ExecuteUpdate();
但它在第2行第41列给出了Antlr.Runtime.MismatchedTokenException
如何使其工作?您可以尝试以下查询:
s.createQuery("UPDATE Guild as gg SET gg.PersistentXPSum = el.XPSum WHERE gg.Id in (SELECT el.GuildId FROM (SELECT SUM(XP) AS XPSum, GuildId FROM User WHERE GuildId != null GROUP BY GuildId ORDER BY XPSum desc LIMIT 50) el)").executeUpdate();
如本文所述
…UPDATE和DELETE语句的伪语法是:(UPDATE | DELETE)FROM?EntityName(WHERE\u条件)?。需要注意的几点:
- 在批量HQL查询中不能指定任何联接(隐式或显式)子查询可在where子句中使用;子查询本身可能包含联接李>
s.CreateQuery(
@"UPDATE Guild as gg
SET gg.PersistentXPSum = el.XPSum
WHERE gg.Id IN
(SELECT GuildId FROM User
WHERE GuildId != null
GROUP BY GuildId
HAVING SUM(XP) > 1000) el")
.ExecuteUpdate();
注意:这在使用SQL Server时是肯定的。也许postgresql应该有一些调整。。。但并非如此关键……同样的例外,从
FROM
s.CreateQuery(
@"UPDATE Guild as gg
SET gg.PersistentXPSum = el.XPSum
WHERE gg.Id IN
(SELECT GuildId FROM User
WHERE GuildId != null
GROUP BY GuildId
HAVING SUM(XP) > 1000) el")
.ExecuteUpdate();