C# 具有复杂内部查询的HQL更新查询

C# 具有复杂内部查询的HQL更新查询,c#,hibernate,postgresql,nhibernate,hql,C#,Hibernate,Postgresql,Nhibernate,Hql,我正在尝试更新Guild.League,当其成员total TournamentXP=0时: 查询在第3行第48列附近抛出Antlr.Runtime.noviablealException 运行正常的原始postgresql查询如下所示: update guilds set league = league + 1 where league <= 5 AND id in ( select guild_id from (

我正在尝试更新Guild.League,当其成员total TournamentXP=0时:

查询在第3行第48列附近抛出Antlr.Runtime.noviablealException

运行正常的原始postgresql查询如下所示:

update guilds set league = league + 1 where league <= 5 
                AND id in (
                    select guild_id from (
                       select guild_id, SUM(u.tournament_xp) AS s from users u where guild_id != 0 group by u.guild_id) r
                    where r.s = 0)
如何使它在HQL中工作


另外,如果您能为查询提出任何优化建议,我将很高兴听到。

这是因为HQL不支持FROM子句上的子查询。 它只支持select/where子句

所以,要么使用本机SQL,要么将内部子查询from子句转换为where子句

顺便说一句,您可以直接使用HAVING子句,并在from子句中避免内部子查询,如下所示:

AND g.Id in (
 select u.GuildId from User u where u.GuildId != 0
 group by u.GuildId
 having SUM(u.TournamentXP) = 0
)

是的,这很有效!如果have不适合,您能否给出一些建议,说明如何将查询从子查询转换为join或HQL支持的内容?
AND g.Id in (
 select u.GuildId from User u where u.GuildId != 0
 group by u.GuildId
 having SUM(u.TournamentXP) = 0
)