하이버네이트 서브쿼리가 Criteria로 가능한가요 ?

679 views
Skip to first unread message

Miller Kim

unread,
May 9, 2014, 6:53:51 AM5/9/14
to ks...@googlegroups.com
DetachedCriteria deptQuery = DetachedCriteria.forClass(ProDept.class)...

이런 형태로 서브쿼리로 집에 넣어주는 건 알겠는데
WHERE 절 아래의 서브쿼리 형태로 쿼리가 던져지더라구요.

쿼리를 짜다보면 SELECT절이나 FROM절에 서브쿼리를 많이 쓰는데

꼭 이 Criteria를 이용해서 구현해보고 싶은데
지식 좀 공유해주실 분 계시나요 ?

참고로 hibernate4 사용중입니다.

YoungHan Kim

unread,
May 9, 2014, 8:06:47 PM5/9/14
to ks...@googlegroups.com
Criteria은 HQL을 만들어내는 빌더 역활을 합니다.

아쉽게도 하이버네이트 HQL은 FROM 절의 서브쿼리를 지원하지 않습니다. ㅠㅠ

일부 JPA구현체 중에는 FROM절의 서브쿼리를 지원하는 것도 있다고 합니다.



2014년 5월 9일 금요일 오후 7시 53분 51초 UTC+9, Miller Kim 님의 말:

최영목

unread,
May 9, 2014, 8:45:30 PM5/9/14
to ks...@googlegroups.com
@김영한님
성능상의 이유(ex. 통계)로 inline-view를 사용해야 할 경우에는 네이티브 쿼리를 사용하거나 필요한 부분만 mybatis와 같은 sql mapper를 사용하는 방법 외에는 다른 방법이 없을까요??

그리고 제가 잘 몰라서 그런데 혹시 JPA 구현체(하이버네이트 포함) 중에 FK로 관계가 맺어져있지 않은 객체 관계(테이블 기준)을 HQL을 통해 조인이 가능한 것도 있는지도 궁금합니다. 예전에 이 부분을 해결을 못해서 sql mapper로 돌아섰던 경험도 있어서요 ㅠㅠ



2014년 5월 10일 오전 9:06, YoungHan Kim <zip...@gmail.com>님이 작성:

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/3a5403e8-244f-4c35-bdf6-fc32bdfeadd5%40googlegroups.com을(를) 방문하세요.

더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

김준일

unread,
May 10, 2014, 1:05:39 AM5/10/14
to ks...@googlegroups.com
으아아 .. 그렇군요. 감사합니다. 그럼 최대한 서브쿼리를 피하거나 다른 방법을 써야겠군요.
그럴 경우 @김영한님은 어떤 방법으로 처리하셨는지 경험을 여쭈어봐도 될까요 ?


2014년 5월 10일 오전 9:06, YoungHan Kim <zip...@gmail.com>님이 작성:
Criteria은 HQL을 만들어내는 빌더 역활을 합니다.

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹의 주제에 가입한 분들에게 전송되는 메시지입니다.
이 주제에서 탈퇴하려면 https://groups.google.com/d/topic/ksug/0HK3fAV98Ko/unsubscribe을(를) 방문하세요.
이 그룹 및 그룹의 모든 주제에서 탈퇴하려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.

http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.

YoungHan Kim

unread,
May 22, 2014, 9:50:02 AM5/22/14
to ks...@googlegroups.com
@Miller Kim

답변이 늦어서 죄송합니다. 아시겠지만 대부분의 서브쿼리는 조인으로 변경이 가능합니다.

그렇게 해서 안되면 하이버네이트가 지원하는 nativeSQL 사용하고 그래도 안되면 jdbcTemplate를 사용해서 그냥 SQL을 씁니다.

저도 FORM 절의 서브쿼리가 너무너무 아쉬워요


2014년 5월 10일 토요일 오후 2시 5분 39초 UTC+9, Miller Kim 님의 말:

YoungHan Kim

unread,
May 22, 2014, 9:53:55 AM5/22/14
to ks...@googlegroups.com
@최영목

답변이 늦어서 죄송합니다. ㅠㅠ

처음 답변은 아래에 해드렸습니다.

JPA 구현체(하이버네이트 포함) 중에 FK로 관계가 맺어져있지 않은 객체 관계(테이블 기준)을 HQL을 통해 조인이 가능한 ...

-> 넵 이것은 처음부터 가능했습니다! 그냥 됩니다. form 절에서 두 엔티티 선택하고, where 절에서 a.id == b.id 로 하시면 됩니다.
전문적인 용어? 로 세타 조인이라고 합니다.


2014년 5월 10일 토요일 오전 9시 45분 30초 UTC+9, 최영목 님의 말:

최영목

unread,
May 22, 2014, 8:24:36 PM5/22/14
to ks...@googlegroups.com
답변 감사합니다. ^^

예전 경험으로는 안되었던 것 같은데 제가 잘못알고 있었네요. (제가 제대로 구현을 못해서 그런 것 같습니다. ㅠㅠ)




2014년 5월 22일 오후 10:53, YoungHan Kim <zip...@gmail.com>님이 작성:

Jihwan Kim

unread,
Jun 24, 2014, 9:50:25 PM6/24/14
to Korea Spring User Group
제가 알기로는 관계가 없는 객체를 Hql에서 where절을 통해 조인을 시도할 경우 실제로는 cross join이 발생합니다. 성능상 이슈가 될 수 있으니 바람직한 방법은 아닌것 같아요.

hql
select s.id, r.id, r.name from Session as s, Role as r where s.roleId = r.id

sql
select
  session0_.id as col_0_0_,
  role1_.id as col_1_0_,
  role1_.name as col_2_0_ 
 from
  lt_session session0_ cross 
 join
  mt_role role1_ 
 where
  session0_.role_id=role1_.id



2014년 5월 23일 오전 9:24, 최영목 <scr...@swtest.co.kr>님이 작성:
Reply all
Reply to author
Forward
0 new messages