2017-03-16 3 views
3

最初の子リストオブジェクト内にLISTを導入するまでは、すべてMyBatisと私が概説したオブジェクトで動作していました。だから今、私の構造は次のとおりです。MyBatis 2番目のネストされたリストはnullを返します

See Object Relationship

私はこのresultMap構成のバリエーションで、XMLマッパーを通じて多数のアプローチを試みました。

<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メソッドと一致します。

の中に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

関連する問題