一切都在使用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的子级,SalesTransactionItem又是父对象的子级。 SalesTransactionItem是一个LIST,然后SalesTransactionTaxRate也是一个LIST。对于ITEM可能会有很多税,并且可以有许多项目用于销售。
我已尝试将SalesTransactionTaxRate映射为SalesTransactionItem 集合中的集合,再次无济于事。当我使用这种方法时,它甚至不会在IDE中注册SalesTransactionTaxRate包含在SalesTransactionItem中。否则,其他对象和属性会自动完成。
所有文档都显示集合中的集合是可能的,但由于某些原因它似乎并不适合我。
非常感谢任何帮助或建议。
答案 0 :(得分:1)
我猜你指的是来自the documentation的<!-- Very Complex Result Map -->
。确实可以将集合映射到另一个集合中。
您遗漏的是结果地图的<id>
元素。
我承认仅说明id – an ID result; flagging results as ID will help improve overall performance
的文档是不够的,并没有解释它的重要性。此id指定用于&#34; group by&#34;的列/属性。 on来构建嵌套列表,否则映射匹配容器对象equals方法可能出现意外结果。
似乎是通过在column
内指定<collection>
属性来尝试的。
最终使用<id>
可能不是必需的,但无论如何我都会强烈推荐它以使事情变得更清晰。
我刚注意到真正的问题: collection 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>