命名查询以选择具有MAX(列名称)的行,使用另一列的DISTINCT

Bar*_*zek 6 java mysql hibernate jpa jpql

我有一个类似于这个问题中描述的情况,我写了一个相同的查询,但是当我尝试将其写为jpql命名查询时,我收到一个错误.

我的查询:

@NamedQuery(
            name = "findRankingsBetween",
            query = "SELECT rt FROM Rankingtable rt " +
                        "INNER JOIN " +
                            "(SELECT teamId, MAX(lastupdate) as MaxDateTime " +
                            "FROM Rankingtable " +
                            "GROUP BY teamId) grouped " +
                        "ON rt.teamId = grouped.teamId " +
                        "AND rt.lastupdate = grouped.MaxDateTime " +
                    "WHERE rt.lastupdate BETWEEN :from AND :to"
            )
Run Code Online (Sandbox Code Playgroud)

错误:

Error in named query: findRankingsBetween: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 79
Run Code Online (Sandbox Code Playgroud)

如何在jpql中正确编写查询?

Bar*_*zek 8

本回答所述,JPQL中的子查询只能出现在select和where子句中. Hibernate doc.

JPQL中的等效查询是:

"SELECT rt FROM Rankingtable rt " +
"WHERE rt.lastupdate = (SELECT MAX(r2.lastupdate) " +
                       "FROM Rankingtable r2 " +
                       "WHERE r2.teamid = rt.teamid) " +
"AND rt.lastupdate BETWEEN :from AND :to"
Run Code Online (Sandbox Code Playgroud)