2014-02-18 2 views
1

두 가지 테이블의 결과를 포함해야하는 검색 양식이 있습니다. 테이블은 서로와 별개의 관계가 없습니다. 예제 시나리오에서는 주유소와 식료품 점이 있습니다. 식료품 점 테이블에는 freezerSize, produceStorage, numberOfCarts와 같은 속성이있을 수 있습니다. 주유소 테이블에는 gasTankSizeInGallons, windowCleanerInGallons 등이있을 수 있습니다. 두 테이블 사이에 공유 필드가 있습니다 (예 : numberOfEmployees, squareFeetOfStoreSpace, numberOfShelves 등).하나의 ibatis 쿼리에서 여러 유형 반환

내 검색 쿼리는 주유소와 식료품 점을 정렬하여 표시해야합니다. SQL 유니온을 사용하고 적용 할 수없는 필드를 0 또는 null로 설정하려고 생각했습니다. 그러나, 나는 정말 (두 객체가 다른 유형 때문에) iBATIS를 사용하여이 작업을 수행하는 방법에 대한 난처한 해요 :

<select id="searchQuery" parameterClass="java.util.Map" resultClass="????????????????"> 
    SELECT 
     storeName, storeCity, storeState, numberOfCarts, freezerSize, 0 gasTankSizeInGallons, 0 windowCleanerInGallons 
    FROM 
     grocery_stores 
    UNION 
    SELECT 
     storeName, storeCity, storeState, 0 numberOfCarts, 0 freezerSize, gasTankSizeInGallons, windowCleanerInGallons 
    FROM 
     gas_stations 
    ORDER BY storeState, storeCity, storeName 
</select> 

주 - 실제 쿼리는 페이지 매김에 의해 순서에 더 많은 일을 가지고, select 필드에는 더 많은 필드가 있고 select 필드의 각 해당 필드에 대한 where 절이 있습니다.

위의 쿼리에 대한 resultClass는 무엇이되어야합니까? 나는 GroceryStore와 GasStation 클래스를 가지고 있는데 둘 다 Store에서 연장됩니다. 그러나 Store에는 GroceryStore 및 GasStation 특정 필드가 많지 않습니다. 두 가지 별도의 쿼리를 수행 할 수 있지만 결과 순서는 Java에서 수행해야하며 많은 양의 데이터를 먼저로드해야하므로 비효율적입니다.

고마워요.

답변

1

많은 검색 결과를 얻은 후에 제 질문에 대한 답변을 찾아 냈습니다.

ibatis discriminator는 gasStation과 groceryStore 클래스를 선택합니다.

<resultMap id="searchResultMap" class="Store"> 
    <discriminator column="storeType" javaType="java.lang.String"> 
      <subMap value="grocery" resultMap="groceryStoreMap"/> 
      <subMap value="gasStation" resultMap="gasStationMap"/> 
    </discriminator> 
</resultMap> 

나는 그 선택 필드에 storeType로 옮겨을 추가하고 groceryStore 및 gasStation위한 된 resultMap을 만들 내 쿼리를 편집합니다.

참고 - 이것을 알아 내기 위해 this stackoverflow question을 읽습니다.

관련 문제