2013-02-04 1 views
3

엔티티 팀, 게임 및 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

짧은 대답은 아니오입니다. 정렬 키가 select 절에 정의되어 있지 않고 JPQL에서 order by을 사용할 수없고 TypedQuery에서 select 절의 요소를 반환하지 않도록 설득 할 수 없습니다.

저는 개인적으로 Transform 방식이 가장 깨끗하고 코드 단위라고 생각합니다. 다음으로 가장 좋은 것은 @ SJuan76이 JPQL Constructor Expressions을 사용하여 제안한 것과 비슷할 것입니다. 아마도 Team에있는 복사 생성자로도 할 수 있기 때문에 중간에 TeamResult 클래스를 만들지 않아도됩니다.

1

데이터를 보유하고 JPQL에서 데이터를 채우는 고유 한 개체를 만들 수 있습니다. 예를 들어 :

가) 매개 변수와 일치하는 생성자가 :

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

TeamResult 모두 할 수있다.

b) 정규화 된 자.

+0

감사합니다. 나는 반환 된 날짜를 사용할 필요가 없습니다. 그리고 가독성과 성능 측면에서 (현재 성능에 대해 신경 쓰지 않고 필요할 때만 최적화 할 계획입니다) trasfrom 함수를 사용하는 것이 더 좋습니다. –

0

"이 쿼리가 작동하지 않습니다."- 예외가 발생합니까? 또한 팀 엔티티에서 maxDate에 대한 속성을 추가 할 수 있습니까? 이 JPQL에서 작동하지만, 당신이 시도 할 수있는 경우 확실하지 않음 다음

(teamid을 선택에서

선택 a.teamid, 최대 teamingame의 TG에서 maxdate로 (g.gamedate), 게임 g 곳 tg.gameId = g .pk 팀 구성 별 (maxdate 내림차순)