2013-02-04 44 views
3

我有實體Team,Game和TeamInGame。要選擇他們上一場比賽所使用的球隊:只使用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<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(); 
+1

當您說「...此查詢不起作用...」時,您是否遇到異常?它是什麼? – sharakan

回答

2

簡短回答是否。您無法在JPQL中使用order by,但沒有在select子句中定義排序鍵,並且您不能說服TypedQuery不返回select子句中的元素,因爲這是查詢的功能!

就我個人而言,我認爲你得到的變換方法是最清晰的,代碼明智的。接下來最好的將是什麼@ SJuan76建議使用JPQL Constructor Expressions。也許你甚至可以用Team本身的拷貝構造函數來做到這一點,這樣你就不必創建一箇中間類TeamResult類。

1

您可以創建自己的對象來存儲數據並從JPQL填充它。例如:

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

TeamResult有兩種:

一)具有與參數相匹配的構造函數。

b)完全合格。

+0

謝謝。我不需要使用返回的日期。我認爲無論是在可讀性還是性能方面(目前我都沒有真正關心性能,並計劃只在需要時對其進行優化)才能更好地利用功能。 –

0

「此查詢不起作用」 - 您是否收到異常? 另外,是否可以在Team實體中爲maxDate添加屬性? 不知道這工作在JPQL,但你可以嘗試以下方法:

從 (選擇teamid

選擇a.teamid,MAX(g.gamedate)從teamingame TG的maxDate,遊戲摹其中tg.gameId = G .pk group by teamid order by maxdate desc)作爲