我有团队,游戏和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();
答案 0 :(得分:2)
简短的回答是否定的。如果没有在order by
子句中定义排序键,则不能在JPQL中select
,并且您无法说服TypedQuery
不返回{{1}中的元素}子句,因为这就是查询的作用!
就我个人而言,我认为你所获得的变换方法是最干净的,代码方面的。接下来最好的是@ SJuan76建议使用JPQL Constructor Expressions。也许您甚至可以在select
本身上使用复制构造函数来执行此操作,这样您就不必创建中间Team
类。
答案 1 :(得分:1)
您可以创建自己的对象来保存数据并从JPQL填充它。例如:
...("select new myPackage.TeamResult(tg.team, max(tg.game.gameDate)) from ..."
TeamResult必须同时:
a)有一个与参数匹配的构造函数。
b)完全合格。
答案 2 :(得分:0)
“此查询不起作用” - 您是否收到例外? 另外,您是否可以在Team实体中为maxDate添加属性? 不确定这是否适用于JPQL,但您可以尝试以下方法:
从中选择a.teamid (选择teamid,max(g.gamedate)为teamingame tg的maxdate,游戏g,其中tg.gameId = g.pk 按队列顺序分组(由maxdate desc)作为