2011-01-20 2 views
3

가입하세요 만들려면 :LEFT OUTER와 JPA 쿼리는이 두 테이블 (및 해당 개체)를 기반으로

나는 그들의 항목의 최고 순위에 의해 정렬 된 모든 프로파일을 나열해야
profiles(id, email, name) 
items(id, profile_id, rank, price) 

Profile(email, name) 
Item(profile, rank, price) 

는 (그것의 사실 "최고 프로필"목록).

SELECT AVG(i.rank) AS rank, p.* FROM profiles AS p LEFT OUTER JOIN items AS i ON p.id = i.profile_id GROUP BY p.id ORDER BY rank DESC; 

내가 JPA에 새로 온 사람과 나는 LEFT OUTER가 CriteriaBuilder에 가입하고에 대한 몇 가지 예를 찾을 수 없습니다 (있는 경우 : 여기

는 같은 SQL 요청이 예를 들어 phpMyAdmin을 그것을 실행할 수있다 그것은 옳은 일입니다).

나는 누군가가 나를 올바른 길로 인도 할 수 있다면 정말로 감사 할 것입니다. (저는 누군가에게 저에게 일자리를 물어 보지 않고 좋은 단서를 가지고있는 것을 요구하지 않습니다).

대단히 감사합니다! :)

+0

어떤 JPA 구현을 사용합니까? 내가 아는 한, Hibernate에서 JPA 2.0 Criteria API를 통해 그러한 쿼리를 표현할 때 몇 가지 문제점이있다. – axtavt

+0

나는 Play를 사용합니다! Framework (http://www.playframework.org/documentation/1.1/jpa)하지만 어떤 버전을 사용하는지 말할 수는 없습니다. (왜 묻는가 : /) –

답변

7

다음과 같이 쿼리 JPQL으로 표현 될 수있다 : 당신이 JPA에서 임의 JOIN의를 쓸 수 없습니다

SELECT p, AVG(i.rank) as rank 
FROM Item i RIGHT JOIN i.profile p 
GROUP BY p 
ORDER BY rank DESC 

참고 만 JOIN의 관계를 통해, 그러므로 여기 RIGHT JOIN이 필요하기 때문에 당신의 관계는 단방향이고 관계의 원천은 왼쪽에 있어야합니다.

이 쿼리는 JPA 2.0 Criteria API에서 매우 간단하게 번역 할 수 있지만, 마지막으로 체크 한 것은 Hibernate의 Criteria API 구현이 올바른 조인을 지원하지 않았기 때문입니다 (Play Framework는 Hibernate를 사용합니다). 따라서이 경우 JPQL 쿼리를 사용해야합니다.

+0

이것은 완벽합니다! 하지만 EntityManager, CriteriaBuilder 등을 사용하여 Java를 사용하는 것이 가능하다고 생각하십니까? –

+0

@ cx42net :이 쿼리는 'EntityManager'를 사용하여 실행됩니다. 'CriteriaBuilder'에 대해서 - 반복합니다, 작동하지 않을 것입니다. – axtavt

+0

아, 그래. 당신의 도움을 주셔서 감사합니다 :) –