IT序号网

MyBatis 第二个嵌套列表返回 null

soundcode 2024年02月27日 编程语言 23 0

一切都与 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 的子对象,后者又是父 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> 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!