2009-10-15 1 views
0
SQLQuery query = session.createSQLQuery("select {o.id} from order o " + 
     "LEFT JOIN bookings b ON b.id = o.bookingId " + 
); 
List pusList = query.addEntity(Order.class) 
     .list(); 

에서 주문 클래스에서 개체의 인출을 제한하기 :는 어떻게해야 SQL 쿼리

@OneToOne(cascade = CascadeType.ALL, mappedBy = "order", fetch = FetchType.LAZY) 
private Trip trip; 

는하지만 실행 중에 내가 참조 : 주먹, 주요 SQL을. 그리고 다음과 같은 many-many 질의 : 최대 절전 모드 :/* load Trip */select ......

Trips을 가져 오는 것을 어떻게 할 수 있습니까?

업데이트 : 이 경우 여행이 필요하지 않습니다. 그리고 그것을 가져 오지 않는 것이 좋습니다.

+0

여행은 귀하의 질의 및 주문 및 예약 테이블과 어떤 관련이 있습니까? 여행을 언급하는 순서 나 예약에 기둥이 있습니까? 당신이 언급 한 모든 SQL의 실행을 촉발시키는 명령문 ("List pusList = .."문이라고 가정합니다. 그러나 그것은 분명하지 않습니다.) – Thorsten

+0

죄송합니다, 질문이 좋지 않습니다. 예약 링크가 여행에 연결되지 않았습니다. 그리고 명령에 Trip이라는 링크가 있습니다. >> 언급 한 모든 SQL 실행을 트리거하는 명령문 ("List pusList = .."문이라고 가정하지만 그 내용은 분명하지 않음) 예, "List pusList = .."입니다. " 그리고이 후에 게터를 호출하지는 않지만 많은 SQL을 볼 수 있습니다. – Max

답변

0

게으 르다 페치하는 것은 메인이로드 된 다음 각 트립이 필요함을 의미합니다.

일반적으로 수행 할 수있는 내용은 Hibernate performance documents을 참조하십시오.

일대일 매핑이므로 가져 오기를 Fetch = FetchType.JOIN으로 변경하면 메인과 같은 시간에로드가로드되고 더 이상 데이터베이스에 추가되지 않습니다.

+0

예, 그러나 Trip() 호출은 list() 호출 직후에 발생합니다. – Max

+0

가져 오기 유형을 변경하면로드됩니다. 게으른 로딩은 그들이 당신의 객체에서 접근 할 때 가장 늦은 시간에 완료된다는 것을 의미합니다 – Mark

0

당신이 이것을 설정했다는 것은 주문 객체를 만들기 위해서 데이터베이스가 트립 테이블을 봐야한다는 것입니다. (내가 정확하게 당신의 정의를 읽었을 때 ' 주문을 참조하는 '여행'표). 이것이 정말로 일대일 관계라고 확신합니까? 귀하의 도메인에 대해 모르겠지만, 일반적으로 외래 키는 일대 다 관계로 매핑되며 속성은 여행이나 주문의 컬렉션입니다.

테이블/관계 및 해당 클래스, 특히 관계가 포함될 것으로 예상되는 멤버에 대한 정보를 추가하십시오. 나는 이것이 로딩이 발생하는 이유와 그것을 막기 위해 할 수있는 일을 설명하는 정보를 우리에게 더 많이 주었다고 생각합니다.