2017-03-16 6 views
3

첫 번째 하위 List 객체 내에 LIST를 도입 할 때까지 모든 것이 MyBatis와 내가 설명한 윤곽선과 함께 작동하고있었습니다. 그래서 지금, 내 구조는 다음과 같습니다 내가 된 resultMap 구성에 변동과 함께 XML 매퍼를 통해 접근 방법을 시도했습니다MyBatis 두 번째 중첩 목록에서 null을 반환합니다.

See Object Relationship

.

<resultMap id="saleTransaction" type="com.company.sale.domain.Sale" autoMapping="true"> 
    <result property="transactionNumber" column="TRANSACTION_ID"/> 
    <result property="salesTrip.tripDate" column="TRIP_DATE"/> 
    <result property="salesTrip.tripNumber" column="TRIP_NUMBER"/> 
    <result property="salesTrip.tripOriginTerminal.iataCode" column="ORIGIN_IATA_CODE"/> 
    <result property="salesTrip.tripOriginTerminal.city" column="ORIGIN_CITY_NAME"/> 
    <result property="salesTrip.tripDestinationTerminal.iataCode" column="DESTINATION_IATA_CODE"/> 
    <result property="salesTrip.tripDestinationTerminal.city" column="DESTINATION_CITY_NAME"/> 

    <collection property="salesTransactionPayments" ofType="SalesTransactionPayment"> 
     <result property="amount" column="AMOUNT"/> 
     <result property="creditCard.cardNumber" column="CC_NUMBER"/> 
     <result property="creditCard.nameOnCard" column="CCHOLDER_NAME"/> 
    </collection> 

    <collection property="salesTransactionItems" column="TRANSACTION_ID" ofType="SalesTransactionItem" select="getSaleItems"> 
     <result property="item" column="ITEM"/> 
     <result property="price" column="PRICE"/> 
     <result property="qty" column="QTY"/> 
     <association property="salesTransactionTaxRates" column="ID" resultMap="taxResult" /> 
    </collection> 

</resultMap> 

<resultMap id="taxResult" type="com.guestlogix.sale.domain.SalesTransactionTaxRate" autoMapping="true"> 
    <result property="code" column="code"/> 
    <result property="rate" column="rate"/> 
    <result property="isFixed" column="isFixed"/> 
</resultMap> 

개체 SalesTransactionTaxRate 차례로 상위 판매 객체의 자식이다 SalesTransactionItem에 자식이 내가 현재 가지고있는 것입니다. SalesTransactionItem은 LIST이고 SalesTransactionTaxRate는 LIST입니다. ITEM에는 많은 세금이 있고 SALE에는 많은 ITEMS가있을 수 있습니다.

나는 아무 소용 다시 SalesTransactionItem 수집수집로 매핑 SalesTransactionTaxRate을 시도했습니다. 이 접근법을 사용하면 SalesTransactionTaxRate가 IDE의 SalesTransactionItem 내에 전혀 포함되어 있지 않다는 것을 등록하지 않습니다. 그렇지 않으면 다른 개체 및 속성에 대한 자동 완성이 있습니다.

모든 문서는 컬렉션 내의 컬렉션이 가능하다는 것을 보여 주며, 어떤 이유로 든 나를 위해 일하지 않는 것 같습니다.

어떤 도움이나 조언이 대단히 감사하겠습니다.

답변

1

<!-- Very Complex Result Map -->the documentation입니다. 실제로 컬렉션을 다른 컬렉션에 매핑 할 수 있습니다.

누락 된 항목은 결과 맵의 <id> 요소입니다. id – an ID result; flagging results as ID will help improve overall performance만으로는 충분하지 않으며 그것이 얼마나 중요한지는 설명하지 않는다는 것을 인정할 것입니다. 이 ID는 중첩 목록을 작성하기 위해 "그룹화"하는 데 사용되는 열/속성을 지정합니다. 그렇지 않으면 예기치 않은 예상 결과가있는 컨테이너 객체 equals 메소드와 일치합니다.

<collection> 안에 column 속성을 지정하여 시도한 것 같습니다.

<id>을 사용하여 결국을 사용할 수는 있지만, 어쨌든 명확하게하기 위해이 방법을 강력히 권장합니다.

난 그냥 진짜 문제 나타났습니다 : 중첩 된 선택은 자신의 결과 맵을 사용하여 별개의 범위 내에서 별개의 문이기 때문에salesTransactionItems 중첩 select를 사용 수집, 중첩 된 매핑을 의미 실제로 사용되지 않습니다 . 이 결과 맵은 존재하지 않지만 단순 매핑 된 열/속성을 자동 매핑하여 기본적으로 부분 매핑이 수행되며 다른 매핑 (이 경우 컬렉션)은 무시되고 null이됩니다. 이 결과 맵은 getSaleItems select 문에 정의되어 사용되어야합니다.

에 따라 매핑은 진실에 가까운해야한다 :

<resultMap id="saleTransaction" type="com.company.sale.domain.Sale" autoMapping="true"> 
     <id property="transactionNumber" column="TRANSACTION_ID"/> 
     <result property="salesTrip.tripDate" column="TRIP_DATE"/> 
     <result property="salesTrip.tripNumber" column="TRIP_NUMBER"/> 
     <result property="salesTrip.tripOriginTerminal.iataCode" column="ORIGIN_IATA_CODE"/> 
     <result property="salesTrip.tripOriginTerminal.city" column="ORIGIN_CITY_NAME"/> 
     <result property="salesTrip.tripDestinationTerminal.iataCode" column="DESTINATION_IATA_CODE"/> 
     <result property="salesTrip.tripDestinationTerminal.city" column="DESTINATION_CITY_NAME"/> 

     <collection property="salesTransactionPayments" ofType="SalesTransactionPayment"> 
      <result property="amount" column="AMOUNT"/> 
      <result property="creditCard.cardNumber" column="CC_NUMBER"/> 
      <result property="creditCard.nameOnCard" column="CCHOLDER_NAME"/> 
     </collection> 

     <collection property="salesTransactionItems" select="getSaleItems" /> 

    </resultMap> 

    <resultMap id="saleItem" type="com.guestlogix.sale.domain.SalesTransactionItem" 
     <id property="item" column="ITEM"/> 
     <result property="price" column="PRICE"/> 
     <result property="qty" column="QTY"/> 
     <collection property="salesTransactionTaxRates" resultMap="taxResult" /> 
    </resultMap> 

    <resultMap id="taxResult" type="com.guestlogix.sale.domain.SalesTransactionTaxRate" autoMapping="true"> 
     <result property="code" column="code"/> 
     <result property="rate" column="rate"/> 
     <result property="isFixed" column="isFixed"/> 
    </resultMap> 
+0

그것은 확실히 독립 SQL SELECT 문입니다. 그것은 메인 쿼리와 독립적이므로 문제를 해결할 수 없습니다. JOINS를 통해 항목을 반환하는 포괄적 인 SQL 쿼리가 이상적입니다. – SiriusBits