3

我有实体 Team、Game 和 TeamInGame。要选择按上一场比赛排序的球队,我使用:

Query query = em.createQuery("select tg.team, max(tg.game.gameDate) as maxDate" +
" from TeamInGame tg" +
" group by tg.team" +
" order by maxDate desc");

return Lists.transform(query.getResultList(), new Function<Object[], Team>() {
            @Override
            public Team apply(Object[] input) {
                return (Team) input[0];
            }
       });

有没有办法摆脱这种转变?此查询不起作用:

return em.createQuery("select tg.team, max(tg.game.gameDate) as maxDate" +
    " from TeamInGame tg" +
    " group by tg.team" +
    " order by maxDate desc", Team.class).getResultList();
4

3 回答 3

2

简短的回答是否定的。order by如果没有在select子句中定义排序键,您不能在 JPQLTypedQuery中不返回子句中的元素select,因为这就是查询的作用!

就个人而言,我认为您所拥有的 Transform 方法是最简洁、最符合代码的方法。下一个最好的方法是 @SJuan76 建议使用JPQL Constructor Expressions。也许您甚至可以在Team其自身上使用复制构造函数,这样您就不必创建中间TeamResult类。

于 2013-02-12T23:33:41.220 回答
1

您可以创建自己的对象来保存数据并从 JPQL 填充它。例如:

  ...("select new myPackage.TeamResult(tg.team, max(tg.game.gameDate)) from ..."

TeamResult 必须:

a) 有一个与参数匹配的构造函数。

b) 完全合格。

于 2013-02-04T14:52:21.953 回答
0

“此查询不起作用” - 您是否遇到异常?另外,您是否可以在 Team 实体中为 maxDate 添加属性?不确定这是否适用于 JPQL,但您可以尝试以下方法:

select a.teamid from (select teamid, max(g.gamedate) as maxdate from teaminggame tg, game g where tg.gameId = g.pk group by teamid order by maxdate desc) 作为

于 2013-02-12T07:14:34.663 回答