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子句中使用;子查询本身可能包含联接
所以,我们知道,我们可以使用子查询。但这并不意味着这种语法(参见下面的有效语法):

还有,非常重要的一点。没有办法,如何在内部HQL(sub)查询中指定限制。那么,让我们假设我们知道第50个值:例如1000

工作查询如下所示:

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