Hibernate 仅为对象使用JPQL select列的子集
我有实体团队、游戏和团队。要选择按最后一场比赛排序的球队,我使用:Hibernate 仅为对象使用JPQL select列的子集,hibernate,jpa,jpa-2.0,jpql,Hibernate,Jpa,Jpa 2.0,Jpql,我有实体团队、游戏和团队。要选择按最后一场比赛排序的球队,我使用: 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&l
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];
}
});
您可以创建自己的对象来保存数据,并从JPQL填充数据。例如:
...("select new myPackage.TeamResult(tg.team, max(tg.game.gameDate)) from ..."
TeamResult必须:
具有与参数匹配的构造函数
b完全合格。此查询不起作用-您是否收到异常? 另外,您是否可以在团队实体中添加maxDate属性? 不确定这是否适用于JPQL,但您可以尝试以下操作: 从中选择一个.teamid 从teamingame tg,game g中选择teamid,maxg.gamedate作为maxdate,其中tg.gameId=g.pk
group by teamid order by maxdate desc作为一个简短的回答是否。如果没有在select子句中定义排序键,您就不能在JPQL中按order by排序,并且您也不能说服TypedQuery不返回select子句中的元素,因为查询就是这样做的
就我个人而言,我认为您使用的转换方法是最干净、最明智的代码。其次是@SJuan76建议使用的内容。也许您甚至可以在团队本身上使用一个复制构造函数,这样您就不必创建中间的TeamResult类。谢谢。我不需要使用返回的日期。我认为从可读性和性能两个方面来看,我目前并不真正关心性能,只打算在需要的时候对其进行优化,因为使用函数的效果更好。当你说……这个查询不起作用……时,你会得到一个例外吗?这是怎么一回事?
...("select new myPackage.TeamResult(tg.team, max(tg.game.gameDate)) from ..."