ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Chris Lamey" <cla...@localmatters.com>
Subject RE: Problem populating a List using groupBy
Date Fri, 23 Jun 2006 20:28:29 GMT
Heya,

This doesn't address your question directly, but is some background for you.  I am also using
iBATIS for the first time in a small but somewhat complex schema.  Along the way I tried using
the groupBy support in the SqlMap xml but gave up and went to the RowHandler callback.  The
RowHandler is so much easier to work with because of the complete control over what result
columns go into which object and what Collection gets which objects.  I've got SQL that joins
across multiple tables, recursive joins, outer joins, and other wacky stuff and the groupBy
support was a little too imprecise for me.  There's also a bug in 2.1.7 with nested columns
in a resultMap, which I think I hit...

Anyway, when I wrote to this list about my saga, I was directed at RowHandler and it made
my year.

Cheers,
Chris


-----Original Message-----
From: Torsten Michelmann [mailto:torsten.michelmann@gmx.de]
Sent: Fri 6/23/2006 8:54 AM
To: user-java@ibatis.apache.org
Subject: Problem populating a List using groupBy
 
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


Mime
View raw message