2012-02-27 3 views
0

가입을 통해 속성 매핑을 만들어 데이터베이스에있는 세 개의 테이블 (이름이 A, B 및 C)이 : 나는 클래스 A를 가지고, 각각최대 절전 모드 : 여러 테이블

 
A 
----- 
ID 
B_ID 
----- 
 
B 
----- 
ID 
C_ID 
----- 
 
C 
----- 
ID 
----- 

을, B와 C


public class A{ 
    private Long id; 
    private Long b_id; 
} 

public class B{ 
    private Long id; 
    private Long c_id; 
} 

public class C{ 
    private Long id; 
} 


<property name="b_id" column="B_ID" type="java.lang.Long" not-null="false"> 

지금 내가의 ID에 대해이 작업을 수행해야합니다 : 당신은 클래스 "A"의 코드에서 볼 수 있듯이

, 나는 followingly 대신 오브젝트의 클래스 B의 ID를 매핑 한 내가 직접

a.getC_id();

와의 관련 C 객체의 ID를 얻을 수 있도록뿐만 아니라 "C", 즉 어떻게 이것을 달성 할 수 있습니까? 이것은 Hibernate가 데이터베이스로부터 A 객체를 읽을 때, C의 ID가 질의에 조인되도록, 즉 추가 질의 나 서브 질의가 없다 (a.getB(). getC_id()가 허용되지 않도록) .

+1

최대 절전 모드는 ORM입니다. 그것은 테이블을 서로 연관된 연관성을 가진 객체로 매핑하기로되어 있습니다. 사용하려는 의도대로 사용하지 않으므로 도구로 싸우고 있습니다. 의도 한대로 Hibernate를 사용하거나, Hibernate를 전혀 사용하지 말아야한다. –

+0

때때로 실제 프로젝트에서 비표준 방식으로 일을하는 이유가 있습니다. 나는 내가 원하는 것을 성취하는 "더 나은"방법을 알고 있지만 가능하면 다양한 외부 적 이유 때문에 이것이 갈 길입니다. – simon

답변

1

먼저

select new com.foo.ADTO(a.id,b.id,c.id) from A a, B b, C c where a.id = b.a_id and b.id = c.b_id

심지어 클래스 A이 작업을 수행 할 수

, 나는 내가 확실하지이기 때문에 피할 수,

public class ADTO { 
    private Long a_id; 
    private Long b_id; 
    private Long c_id; 
    public ADTO(Long a_id,Long b_id,Long c_id){ 
     this.a_id = a_id; 
     this.b_id = b_id; 
     this.c_id = c_id; 
    } 
} 

지금 쿼리를 사용하는 DTO 객체를 생성 AC id 사이의 관계는 one to one에 해당합니다. DTO는 항상 안전합니다.

HQL 선택을 조정하는 방법에 대한 API 문서 here 또는 here을 읽으십시오.

1

ManuPK의 답안을 변형하여 A의 인스턴스를 DTO에 넣을 수도 있습니다.

public class AWithCID { 
    public final A a; 
    public final cID; 
    public AWithCID(A a, Long cID) { this.a = a; this.cID = cID; } 
} 

select new AWithCID(a, b.cID) from A a, B b where a.bID = b.id 
관련 문제