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句でソートキーを定義せずにJPQLを使用することはできません。また、句で要素を返さselectないように説得することはできません。これは、クエリが行うことだからです。TypedQueryselect

個人的には、あなたが持っているTransformアプローチは、コード的に最もクリーンだと思います。次善の策は、@SJuan76がJPQLコンストラクタ式を使用して提案したようなものです。おそらく、それ自体にコピーコンストラクターを使用してそれを行うこともできるので、中間クラス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

「このクエリは機能しません」-例外が発生していますか?また、チームエンティティにmaxDateの属性を追加することは可能ですか?これがJPQLで機能するかどうかはわかりませんが、次のことを試してみてください。

select a.teamid from(select teamid、max(g.gamedate)as maxdate from teamingame tg、game g where tg.gameId = g.pk group by teamid order by maxdate desc)

于 2013-02-12T07:14:34.663 に答える