仅使用JPQL选择列的子集作为对象

时间:2013-02-04 14:48:54

标签: hibernate jpa jpa-2.0 jpql

我有团队,游戏和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();

3 个答案:

答案 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)作为