一切都与 MyBatis 和我概述的对象一起工作,直到我在第一个子 List 对象中引入了一个 LIST。所以现在,我的结构是:
我已经通过 XML 映射器尝试了多种方法,并在 resultMap 配置上进行了变体。这是我目前拥有的:
<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 的子对象,后者又是父 Sale 对象的子对象。 SalesTransactionItem 是一个 LIST,然后 SalesTransactionTaxRate 也是一个 LIST。一个 ITEM 可以有很多税,一个 SALE 可以有很多 ITEMS。
我曾尝试将 SalesTransactionTaxRate 映射为 SalesTransactionItem collection 中的一个collection,但同样无济于事。当我使用这种方法时,它甚至根本没有在 IDE 中注册 SalesTransactionTaxRate 包含在 SalesTransactionItem 中。否则,其他对象和属性会自动完成。
所有文档都表明集合中的集合是可能的,但出于某种原因它似乎对我不起作用。
非常感谢任何帮助或建议。
请您参考如下方法:
我猜你指的是 <!-- Very Complex Result Map -->
来自 the documentation .事实上,将一个集合映射到另一个集合中是可能的。
你错过的是<id>
结果映射的元素。 我承认文档仅说明 id – an ID result; flagging results as ID will help improve overall performance
是不够的,也没有解释它的重要性。此 id 指定用于“分组依据”以构建嵌套列表的列/属性,否则容器对象上的映射匹配 equals 方法可能会产生意外结果。
似乎是通过指定 column
来尝试的<collection>
内的属性.
最终使用<id>
可能不是必需的,但无论如何我强烈推荐它以使事情更清楚。
我刚刚注意到真正的问题:收藏 salesTransactionItems
使用嵌套 select
,这意味着实际上没有使用嵌套映射,因为嵌套 select 是不同范围内的不同语句,使用它自己的结果映射。此结果映射不存在,但默认情况下通过自动映射简单类型的列/属性来简单地完成部分映射,其他(在本例中为集合)将被忽略,然后为 null。此结果映射必须由 getSaleItems
定义和使用选择语句。
下面的映射应该更接近事实:
<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>