MyBatis第二个嵌套列表返回null

时间:2017-03-16 12:40:51

标签: mybatis spring-mybatis

一切都在使用MyBatis和我概述的对象,直到我在第一个子List对象中引入了LIST。所以现在,我的结构是:

See Object Relationship

我已经通过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中。否则,其他对象和属性会自动完成。

所有文档都显示集合中的集合是可能的,但由于某些原因它似乎并不适合我。

非常感谢任何帮助或建议。

1 个答案:

答案 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>