【问题标题】:Use only subset of JPQL select columns for objects仅对对象使用 JPQL 选择列的子集
【发布时间】:2013-01-19 07:10:45
【问题描述】:

我有实体 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();

【问题讨论】:

  • 当您说“...此查询不起作用...”时,您是否遇到异常?这是什么?

标签: hibernate jpa jpa-2.0 jpql


【解决方案1】:

简短的回答是否定的。如果没有在select 子句中定义排序键,您不能在JPQL 中order by,并且您不能说服TypedQuery 不返回select 子句中的元素,因为这就是查询可以!

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

【讨论】:

    【解决方案2】:

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

    从中选择一个.teamid (select teamid, max(g.gamedate) as maxdate from teaminggame tg, game g where tg.gameId = g.pk 按 maxdate desc 的 teamid 顺序分组)作为一个

    【讨论】:

      【解决方案3】:

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

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

      TeamResult 必须两者兼有:

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

      b) 完全合格。

      【讨论】:

      • 谢谢。我不需要使用返回的日期。而且我认为在可读性和性能方面(我目前并不关心性能并计划仅在需要时对其进行优化)trasfrom using function 更好。
      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 2014-08-08
      • 2012-09-07
      • 2023-04-10
      • 1970-01-01
      • 2011-07-22
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多