2010-02-12 2 views
13

최대 절전 모드를 사용할 수 있습니까?최대 절전 기준과 다중 참여

select A.something, B.something, C.something, D.something 
    from A JOIN B on A.id = B.id_fk 
      JOIN C ON B.id = C.id_fk 
      JOIN D ON C.id = D.id_fk; 
+0

http://stackoverflow.com/questions/8726396/hibernate-criteria-join-with-3-tables 당신을 도울 수있는 언급 한 링크 위 . –

답변

17

나는 정확히 같은 문제를 가지고,이처럼 해결 할 수 있었다있다 :

return criteria.createCriteria(A.class) 
       .createCriteria("b", "join_between_a_b") 
       .createCriteria("c", "join_between_b_c") 
       .createCriteria("d", "join_between_c_d") 
       .add(Restrictions.eq("some_field_of_D", someValue)); 

참고 : 코드에서 "b", "c""d"A, BC에 속성 이름을 참조 따라서 클래스 (A 클래스의 속성은 b입니다.

lazyfetch 매개 변수를 A.hbm.xml에 설정할 필요가 없습니다.

+0

다음 SQL은 어떻습니까? A.fk_id = B.id의 내부 조인 B에서 A.columnA1, B.columnB1, C.columnC1을 선택하고 C.fk_id = B.id의 내부 조인 C를 선택합니다. – maximilianus

+0

이에 대해 별도의 질문을하십시오. – mindas

1

처럼, 당신의 기준에 페치 모드를 설정하십시오 :

criteria.setFetchMode(..., FetchMode.EAGER) 

이 조인 쿼리를 작성합니다. 자세한 내용은 here을 참조하십시오.

2

Hibernate Reference material에는 setFetchMode를 사용하여 외부 조인과의 연관을 페치하는 몇 가지 좋은 예가 있습니다.

예는 다음과 같습니다 또한 당신에게 유용 할 수 있습니다 information there about different fetching stragies 있습니다

List books = sess.createCriteria(Book.class) 
.setFetchMode("chapters", FetchMode.EAGER) 
.setFetchMode("reviews", FetchMode.EAGER) 
.list(); 

.

+0

사실 이것은 나에게 효과가 없었기 때문에 내가 게시 한 답변에서와 같이해야만했다. 'D'에 대한 추가 기준이 있었기 때문일 수 있습니다. – mindas

0

예, 사실 몇이 일의 방법이 있습니다 :

  1. 이 연관을 매핑, false로 lazyness을 설정하고 가입하는 모드를 가져옵니다. 이것은 모든 기준 쿼리에 영향을 미칩니다.
  2. 다른 답변에서 자세히 설명한대로 setFetchMode를 사용하십시오.
  3. criteria.createAlias ​​(또는 createCriteria)를 사용하십시오. 또한 조인 할 행을 더 많이 제한 할 수 있습니다.