2015-09-04 33 views
0

我試圖當其會員總數TournamentXP = 0來更新Guild.League具有複雜內查詢HQL更新查詢

using (var session = sessionFactory.OpenStatelessSession()) 
    using (var tx = session.BeginTransaction()) 
    { 
     const int maxLeagues = 6; 
     session.CreateQuery(
      @"update Guild g set g.League = g.League + 1 where g.League < " + maxLeagues + @" 
       AND g.Id in (
        select GuildId from (
         select GuildId, SUM(u.TournamentXP) AS s from User u where GuildId != 0 group by u.GuildId) r 
        where r.s = 0) 
     ").ExecuteUpdate(); 

     tx.Commit(); 
    } 

查詢拋出「Antlr.Runtime.NoViableAltException」近線3,列48的查詢。

原來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工作?

此外,如果您可以提出任何優化的查詢,我會很高興聽到它。

回答

0

這是因爲HQL不支持FROM子句上的子查詢。 它只支持select/where子句。

因此,要麼使用本機SQL(或)將你的內部子查詢從子句轉換爲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 
) 
+0

是啊,這作品!你可以給出任何關於如何使用FROM子查詢轉換查詢以加入HQL支持的任何建議,以防不適合? – Vlad