Hi folks,

again me (seems that I am touching all the rather complicated topics of iBatis 
during my very first project).
The problem is appearing while I try to avoid an N+1 select for a 1:M 
relationship (as described on p. 36 in the latest developer guide).
I think that I may be using the groupBy attribute in an incorrect way but I am 
not sure how it has to be done correctly. (I tried using groupBy="ID" as well 
as groupBy="id" but that returned the same error).

com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in global/persistence/mom/MOM_SqlMap.xml.  
--- The error occurred while applying a result map.  
--- Check the MOM.r_getCustomerOrder.  
--- The error happened while setting a property on the result object.  
--- Cause: com.ibatis.common.beans.ProbeException: Could not set property 
'customerOrderItemsList' for global.persistence.mom.CustomerOrderMapper.  
Cause: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
Caused by: com.ibatis.common.beans.ProbeException: Could not set property 
'customerOrderItemsList' for global.persistence.mom.CustomerOrderMapper.  
Cause: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)


//The mapping
        <resultMap id="r_getCustomerOrder" class="CustomerOrderMapper" 
groupBy="orderItemKey.articleKey.articleId">
                <result property="objectId" column="ID" />
                <result property="comment" column="COMMENT" />
                <result property="mom" column="IS_MOM" />
                <result property="kimStatus" column="KIMSTATUS" />
                <result property="customerOrderKey.customerId" 
column="CUSTOMER_ID" />
                <result property="customerOrderKey.orderId" column="ORDERID" />
                <result property="customerOrderKey.version" column="VERSION" />
                <result property="customerOrderKey.moduleKey.moduleId" 
column="MODULE_ID" />
                <result property="customerOrderKey.collectionKey.seasonId" 
column="SAISON" />
                <!-- <result 
property="customerOrderKey.collectionKey.collectionCategoryId" column="SEGMENT" 
/>  not existant within MOM-->
                <result property="customerOrderKey.collectionKey.segmentId" 
column="SEGMENT" />
<!--    <result property="customerOrderItemsList" column="{id=ID}" 
select="getCustomerOrderItem" />  -->
                <result property="customerOrderItemsList" 
resultMap="MOM.r_getCustomerOrderItem" /> 
        </resultMap>
        <resultMap id="r_getOrderItemBase" class="OrderItemBase">
                <!-- <result property="objectId" column="" />  -->
                <!-- <result property="salesPrice" column="" />  -->
                <!-- <result property="recommendedRetailPrice" column="" />  -->
                <!-- <result property="currency" column="" />  -->
                <result property="orderItemKey.articleKey.articleId" 
column="ARTICLE_NUM" />
                <result 
property="orderItemKey.articleColourKey.articleColourId" column="COLOUR" />
                
        </resultMap>
        <resultMap id="r_getOrderItem" class="OrderItem" 
extends="r_getOrderItemBase">
                <result property="orderedQuantity" column="ORDERED_QUANTITY"/>
        </resultMap>
        <resultMap id="r_getCustomerOrderItem" class="CustomerOrderItem" 
extends="r_getOrderItem">
                <result property="size" column="ARTICLE_SIZE" />
                <result property="length" column="ARTICLE_LENGTH" />
        </resultMap>

//The query 
                        SELECT c.ID, c.COMMENT, c.KIMSTATUS, c.CUSTOMER_ID, 
c.ORDERID, c.VERSION, c.MODULE_ID, c.SAISON, c.SEGMENT, c.IS_MOM, 
a.ARTICLE_NUM, d.COLOUR, d.ORDERED_QUANTITY,e.ARTICLE_SIZE, e.ARTICLE_LENGTH
                        FROM
                                MENU.ARTICLE a inner join 
MENU.ARTICLE2MENUORDER b on a.ARTICLE_NUM=b.ARTICLE_NUM
                    inner join MENU.MENUORDER c on b.MENUORDER_ID=c.ID
                    left outer join MENU.COLOUR2ARTICLE d on d.ART2MO_ID=b.ID
                    left outer join MENU.SIZE2ARTICLE e on d.ART2MO_ID=b.ID
                WHERE 
                        c.ID=#objectId#                 


//Customer Order is providing only methods access an Array, thus the Wrapper. I 
have provided this class in order to allow you to ensure that I am not missing 
anything in here.
public class CustomerOrderMapper extends CustomerOrder {
    public void setCustomerOrderItemsList(List pCustomerOrderItemList) {
        if (pCustomerOrderItemList.size() > 0) {
            CustomerOrderItem[] coi= (CustomerOrderItem[]) 
pCustomerOrderItemList.toArray(new 
CustomerOrderItem[pCustomerOrderItemList.size()]);
            setCustomerOrderItems(coi);
        }
    }

    public List getCustomerOrderItemsList() {
        if(getCustomerOrderItems()==null)
        {
            return new ArrayList();
        }
        else
        {
            return Arrays.asList(getCustomerOrderItems());
        }
    }
}




-- 
Gruß
Torsten Michelmann

"Feel free" – 10 GB Mailbox, 100 FreeSMS/Monat ...
Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail

Reply via email to