'With'에 해당되는 글 2건

  1. 2008.04.13 HQL - join
  2. 2008.04.13 HQL - where 절

HQL - join

Hibernate 2008.04.13 02:06
from 절에서 내부조인
from Seller s join s.items i where i.price > 1000
많은 의미가 담겨 있고 주의할 점도 있으므로 하나씩 알아 보겠습니다.
1) from 절에서 Seller 객체와 연관 컬렉션 객체인 items 를 내부조인 했습니다.
2) 조인한 상태에서 컬렉션 객체의 alias인 i를 통해 dot(.)으로 프로퍼티에 접근하여 조건을 주었습니다.
3) 2에서 i의 의미는 컬렉션 타입의 객체 자체가 아니라 컬렉션에 들어가는 하나의 Item 입니다.
4) 조회된 결과는 이런 형태일 것 입니다.

보기

5) Seller 객체와 Item 객체가 하나의 행으로써 조회 되기 때문에 Seller 객체가 중복 됩니다.
6) 돌려받은 리스트에 들어있는 객체는 Object 배열로써 Seller와 Item 객체가 담겨 있습니다.

보기

7) 5에서 밝혔다 시피 객체가 중복 됩니다. 그리고 결과 리스트에 조인된 Item 객체까지 포함됩니다.
8) 아래 두 hql은 동일 합니다. (select 절은 따로 자세히 알아 보겠습니다.)
from Seller s join s.items i where i.price > 1000
select s, i from Seller s join s.items i where i.price > 1000
9) 1000원 이상의 제품만 판매하는 판매자의 리스트만 중복없이 조회하고 싶다면 이렇게 수정 합니다.
select distinct s from Seller s join s.items i where i.price > 1000
10) 이제 결과 리스트에는 중복 없는 Seller 객체만 담겨 있습니다.

보기

from 절에서 외부조인
from Seller s left join s.items i with i.price > 1000
외부조인을 사용하기 위한 키워드는 SQL의 그것과 동일 합니다.
하지만 외부 조인 객체의 조건을 where절이 아닌 with절에 주었다는것에 주목해야 합니다.
with는 외부조인시 외부조인 객체에 조건을 줄 때 사용하는 HQL의 특별한 키워드 입니다.

with 사용시 결과

만약 where절에 조건을 주었다면 내부조인과 다를 것이 없었을 것입니다.

where 사용시 결과


자동 조인
1-1 또는 n-1 관계일 경우 join 키워드를 사용하지 않더라도 dot(.)으로 접근하여 조건을 지정할 수 있습니다.
1-1 관계에서의 조인

from Article a where a.detail.content = :content

n-1 관계에서의 조인
from Comment c where c.article.title = :title

where 절에서 조인
from 절에서 했던 조인은 where 절에서도 할 수 있습니다.
프로퍼티를 생략하면 객체의 식별값을 비교합니다. 따라서 아래 두 hql은 동일 합니다.
from Seller s, Item i where i.seller = s
from Seller s, Item i where i.seller.id = s.id

연관 관계가 없는 객체끼리도 where 절에서 조인을 할 수 있습니다.
from Article a, Seller i where a.writer = i.name

조인에서 페이징
다음 hql은 페이징시 문제가 발생 합니다.
from Seller s join s.items
문제가 발생하는 이유는 조회되는 행들에서 Seller 객체가 중복되기 때문에 원하는 결과가 나오지 않습니다.
따라서 select 절에서 특정 객체만 조회하면서 중복을 제거해야 원하는 결과가 나옵니다.
select distinct s from Seller s join s.items

조인에서 iterate()
from Seller s join s.items
위 hql로 iterate() 메서드를 호출하면 Seller의 식별값과 Item의 식별값만 가져오는 SQL이 수행 됩니다.
매우 정상적이죠... 하지만 select 절을 사용하는 순간 결과는 삐뚤어 집니다.
아래 hql로 iterate() 메서드를 호출하면 말도 안되는 SQL이 실행되니 조인 상황에서 iterate() 메서드 사용시 조심해야 겠습니다.
select s from Seller s join s.items
select distinct s from Seller s join s.items

말도 안되는 SQL 보기



신고

'Hibernate' 카테고리의 다른 글

HQL - fetch  (0) 2008.04.13
HQL - select 절  (0) 2008.04.13
HQL - join  (0) 2008.04.13
HQL - where 절  (0) 2008.04.13
HQL - 시작, from 절  (0) 2008.04.13
HQL - API  (0) 2008.04.13
Posted by 째코

HQL - where 절

Hibernate 2008.04.13 02:05
HQL에서 where 절은 객체 지향으로 조건을 지정할 수 있기 때문에 매우 강력 합니다.

JDBC 스타일의 ?(위치 파라미터)는 매우 친숙 합니다.
from Article a where a.id = ?

hql만의 명명된 파라미터는 더욱 강력 합니다.
from Article a where a.id = :id

다음 hql은 join을 필요로 하지 않습니다. 하지만 join을 포함한 sql로 변역 됩니다.
hql에서는 객체의 프로퍼티에 dot(.)으로 접근해서 매우 간단하게 조건을 지정할 수 있습니다.
from ArticleDetail ad where ad.article.title like :title

식별 값을 비교하는 거라면 궂이 프로퍼티까지 접근할 필요도 없습니다. 그냥 객체끼리 비교하면 됩니다.
from ArticleDetail ad where ad.article = :article

이 내용은 HQL-API 에서 이미 다뤘던 내용들 이지만 따로 분리 해야할 필요성을 느꼇기에 따로 정리 했습니다.
신고

'Hibernate' 카테고리의 다른 글

HQL - select 절  (0) 2008.04.13
HQL - join  (0) 2008.04.13
HQL - where 절  (0) 2008.04.13
HQL - 시작, from 절  (0) 2008.04.13
HQL - API  (0) 2008.04.13
늦은로딩과 조회방식  (0) 2008.04.09
Posted by 째코


티스토리 툴바