2009-05-09 9 views
0

최대 절전 모드에서 쿼리 문제가 발생했습니다. 기존 데이터가있는 '테스트'테이블이 있습니다. 테스트 테이블의 스키마를 수정할 수없는 요구 사항이 있으므로 다른 테이블 'testExtension'을 만들었습니다.이 테이블의 기본 키는 Test의 기본 키에 대한 외래 키입니다. testExtension의 데이터는 테스트중인 데이터의 하위 집합입니다. 즉, 'test'보다 'testExtension'에 더 적은 행이 있습니다. 이 설정으로최대 절전 모드를 사용하여 "확장 테이블"쿼리

<class name="Test" table="test"> 
<id name="testId" column="test_id"> 
    <generator class="sequence"> 
     <param name="sequence">test_id_seq</param> 
    </generator> 
</id> 

<property name="name"/> 


<joined-subclass name="TestExtension" table="testExtension"> 
    <key column="test_id"/> 

    <property name="summary" /> 
    <property name="homepage"/> 
</joined-subclass> 

, 나는 나의 자바 프로그램에서 TestExtension 객체를 생성 데이터로 채울 수 있어요, 다음과 같이

나는 구성 파일에서이 관계를 정의 Hibernate를 통해 '저장'하고 트랜잭션을 커밋합니다. 또한 Test 및 TestExtension에 데이터를 올바르게 저장합니다.

이 테이블에서 데이터를 쿼리 할 때 내 문제가 발생합니다. QBE에 대한 TestExtension.class를 사용하여 특정 test_id를 쿼리하면 Test와 TestExtension에 해당 ID가있는 경우에만 행을 반환합니다. Test.class를 QBE에 사용하면 행이 반환되지만 TestExtension에 저장된 데이터에 액세스 할 수는 없습니다.

내 질문은 : 결과가 Test 및 TestExtension의 '왼쪽 외부 조인'을 기반으로하도록 이러한 테이블을 어떻게 쿼리 할 수 ​​있습니까? 예제에 의한 질의, HQL, 또는 다른 어떤 것이 든 (모든 것이 바람직하지만 원시 SQL은 아님) 모든 솔루션이 만족 스럽습니다.

감사합니다.

+0

최대 절전 모드 주석을 사용할 수 있습니까? 주석을 사용하여 exectly 동일한 작업을 수행했으며 원하는 경우 샘플을 제출할 수 있습니다. –

답변

1

아마도이 작업을 수행하는 가장 쉬운 방법은 HQL입니다. 문서 도구 현재 위치 :

http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql-joins.html

은 당신이 수행 할 수 있습니다하면 해당 테스트 및 TestExtension 상속 대신 일대일 관계를 사용하여 귀하의 관계를 매핑처럼 소리. 그런 다음 일대일의 왼쪽 외부 조인을 사용하여 Test 및 TestExtension을 쿼리 할 수 ​​있습니다.

+0

네,이 작동합니다. TestExtension이 'Test'POJO의 또 다른 객체 인 일대일 매핑이 끝났습니다. 이 방법으로 관계를 설정하면 QBE가 예상했던대로 동작합니다. 'Test'클래스를 사용하여 예제로 쿼리를 실행하면 'test'테이블의 모든 항목에 대해 쿼리를 수행하여 내 확장 테이블에 관련된 항목이 있으면 Test.TestExtension 개체. – Todd

0

HQL을 사용하여 Test 클래스에 대한 쿼리를 작성하는 경우 원하는 작업을 수행해야합니다. QBE 효과적으로 쿼리 매개 변수 중 하나로 예제 엔터티 클래스를 추가하는 것으로 가정합니다.

그래서 같은 STH :

from Test t where t.property = :value 

중 하나를 테스트 또는 TestExtension 개체를 반환해야합니다. 적어도 (내가 사용했던 Hibernate의 버전에서)주의를 기울이십시오. 이 경우, Hibernate는 즉시 프록시가 아닌 실제 엔티티를 돌려 주어야한다. TestExtension 엔티티는 때때로 평범한 테스트 지연로드 프록시로 리턴 될 수 있다는 것을 알아야한다.

관련 문제