ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Claudio Iacovozzi" <claudio.iacovo...@googlemail.com>
Subject Re: Problem with several one to many relationships in breadth
Date Tue, 27 Feb 2007 13:30:18 GMT
Jeff, according to your advice I'm trying to implement my own row handler to
create the correct beans. Unfortunately I can't find much documentation or
examples.

On page 62 of the IBATIS Data Mapper Developer Guide the 'handleRow(Object
valueObject)' method is described as "...This method will be called on the
RowHandler for each row returned from the database. The valueObject passed
into the method is the resolved Java object for the current row..."

In my tests (see the exmaple in my first post) the handleRow method is not
called for every row in the result set, but just once!

This is my code:

public class MyRowHandler implements RowHandler {
    public void handleRow(Object object) {
        ...
    }
}

In my DAO I call the queryWithRowHandler method:

myRowHandler rowHandler = new MyRowHandler();
...
getSqlMapClientTemplate().queryWithRowHandler("getAgent", parameters,
myRowHandler);


The result set is:
agentId,agent_firstname,agent_lastname,eventId,title,customerId,customer_firstname,customer_lastname
{1,Agent1,Smith,1,housebreaking,1,Customer1,Johnson}
{1,Agent1,Smith,4,theft,1,Customer1,Johnson}
{1,Agent1,Smith,2,damage,3,Customer2,Miller}

=> handleRow is called once, the parameter valueObject is an Agent object
which contains the data of the first row of the result set. Then the other
rows are processed by IBATIS as well, but myRowHandler.handleRow is never
called again.

If a list of objects is returned (the example above returned just a single
object), then handleRow is called for every new instance.

I expected that handleRow is called for every row of the result set, so that
I can create the correct bean.
Obviously I'm making a mistake.

Thanks in advance for any help,
Claudio


2007/2/20, Jeff Butler <jeffgbutler@gmail.com>:
>
> Tim - I'd take a very close look at whether it's really working in iBATIS
> 2.1.7.  If it is, then it's just dumb luck.
>
> Take a look at the test case I added to the JIRA ticket:
>
> http://issues.apache.org/jira/browse/IBATIS-396
>
> This test fails under both 2.1.7 and 2.3.0, but in different ways.
>
> Of course, I'd be happy to be proven wrong about this :)
>
> Jeff Butler
>
>
>
>
> On 2/20/07, Tim.Hammar@mcnichols.com < Tim.Hammar@mcnichols.com > wrote:
> >
> >
> > Hi Jeff,
> > Claudio and I are able to use 2.1.7 successfully - it stopped working in
> > 2.2 versions.  Bummer about there maybe not being a fix going forward -
> > I've got a ton of queries that use this feature and of course I don't  want
> > to change any long-time stable code which I'd have to do to use a
> > RowHandler.  Pending a fix, I guess we'll have to go back to using nested
> > selects.
> >
> > Regards,
> > Tim
> >
> >
> >
> >   *"Jeff Butler" <jeffgbutler@gmail.com >*
> >
> > 02/20/2007 12:11 PM   Please respond to
> > user-java@ibatis.apache.org
> >
> >    To
> > user-java@ibatis.apache.org  cc
> >   Subject
> > Re: Problem with several one to many relationships in breadth
> >
> >
> >
> >
> > Interesting....
> >
> > In my tests, it fails in BOTH versions (2.1.7 and 2.3.0), but in
> > different ways.  So something definitely changed.  In my test, 2.3.0 is
> > closer to correct than 2.1.7 is.
> >
> > But the important truth is that it does fail in both versions.
> >
> > For now, I think a row handler is the best way to go forward with this.
> >
> > I'll open a JIRA ticket with my test case, so everyone can see it.  No
> > guarantees about a fix, but at least it will be logged.
> >
> > Jeff Butler
> >
> >
> >
> > On 2/20/07, *Jeff Butler* < *jeffgbutler@gmail.com*<jeffgbutler@gmail.com>>
> > wrote:
> > I''m surprised by this (obviously).  I'll take a look.  It probably has
> > to do with the new support for multiple result sets.
> >
> > Jeff Butler
> >
> >
> >
> > On 2/20/07, *Claudio Iacovozzi* < *claudio.iacovozzi@googlemail.com *<claudio.iacovozzi@googlemail.com>>
> > wrote:
> > I tested my given example with iBatis 2.1.7.597 and it works! Ibatis
> > creates the expected bean:
> > Agent1  --> List<Customer> {1:Customer1, 3:Customer2}
> >        --> List<Event> {1:housebreaking, 2:damage, 4:theft}
> >
> > Further tests with more depth (e.g. Custommer containing adresses) or
> > breadth (Agent containing additional List of addresses) were also
> > successful.
> >
> > So Tim ist right and something in iBatis must have been changed. We
> > currently use version 2.2.0.638 / 2.3.0.677.
> >
> > => so what's the best solution if we still want to use the newest
> > version? Should we implement our own row handler and how can that be done?
> > Or is it possible that the behaviour of 2.1.7.597 will be restored?
> >
> >
> >
> >
> >
> >
> >
> >
> > 2007/2/19, Jeff Butler < *jeffgbutler@gmail.com* <jeffgbutler@gmail.com>>:
> >
> > That's a good solution - then you could deal with object identity
> > yourself.
> >
> > Jeff Butler
> >
> >
> > On 2/19/07, *Larry Meadors* < *lmeadors@apache.org *<lmeadors@apache.org>>
> > wrote:
> > ..or you could use a rowhandler.
> >
> > Larry
> >
> >
> >
> > On 2/19/07, *Jeff Butler *< *jeffgbutler@gmail.com *<jeffgbutler@gmail.com>>
> > wrote:
> > iBATIS groupBy support does not support two independant lists.  This
> > would be a very difficult problem to solve and would require us to deal with
> > object identity - which we don't deal with now.
> >
> > So with groupBy, you can have one and only one list that is
> > automatically populated.  Other lists will need to be populated with a
> > nested select.
> >
> > Jeff Butler
> >
> >
> >
> > On 2/19/07, *Tim.Hammar@mcnichols.com* <Tim.Hammar@mcnichols.com> < *
> > Tim.Hammar@mcnichols.com* <Tim.Hammar@mcnichols.com> > wrote:
> >
> > Greetings Claudio,
> >
> > We too have this problem with the latest two releases.  If you use
> > version 2.1.7.597 you should have no problems - hopefully you have not
> > implemented any new features like we had (and had to scramble to undo).
> >  Versions 2.2 and 2.3 will not handle what you are trying to do.  I have
> > been so swamped that I have been unable to generate a test case and submit a
> > bug report.  Maybe your example will suffice.
> >
> > Regards,
> > Tim Hammar
> >
> >
> >
> >   *"Claudio Iacovozzi" <* *claudio.iacovozzi@googlemail.com *<claudio.iacovozzi@googlemail.com>
> > *>*
> >
> > 02/19/2007 06:51 AM
> >   Please respond to*
> > **user-java@ibatis.apache.org* <user-java@ibatis.apache.org>
> >
> >
> >   To
> > *user-java@ibatis.apache.org* <user-java@ibatis.apache.org>  cc
> >   Subject
> > Problem with several one to many relationships in breadth
> >
> >
> >
> >
> >
> >
> > We have a problem filling objects with several '1 to many
> > relationships' in breadth from one single SQL statement.
> >
> > On page 40 of the iBatis Data Mapper Developer Guide the 'groupBy'
> > construct is described as follows:
> > "Using this approach, you can solve any N+1 problem of any depth or
> > breadth."
> >
> > This just seems to work for any depth but NOT for any *breadth*.
> >
> > Example:
> >
> > An insurance agent contains a list of customers as well as a list of
> > insured events.
> >
> > <resultMap class="agent" id="agent" groupBy="id" >
> > <result property="id" column="agentId" />
> > <result property="firstName" column="agent_firstname" />
> > <result property="lastName" column="agent_lastname" />
> > <result property="events" resultMap="event" />
> > <result property="customers" resultMap="customer" />
> > </resultMap>
> >
> > <resultMap class="event" id="event" groupBy="id" >
> > <result property="id" column="eventId" />
> > <result property="title" column="title" />
> > </resultMap>
> >
> > <resultMap class="customer" id="customer" groupBy="id" >
> > <result property="id" column="customerId" />
> > <result property="firstName" column="customer_firstname" />
> > <result property="lastName" column="customer_lastname" />
> > <result property="street" column="street" />
> > <result property="city" column="city" />
> > </resultMap>
> >
> > - The used SQL statement:
> >
> > <select id="getAgent" resultMap="agent" parameterClass="int">
> > SELECT a.agentId, a.FirstName as agent_firstname, a.LastName as
> > agent_lastname, b.eventId, b.title,
> > c.customerId, c.FirstName as customer_firstname, c.LastName as
> > customer_lastname, c.street, c.city
> >
> > FROM insurance_agent a, agenteventlink ab, insured_event b, customer c
> > WHERE a.agentId = ab.agentId
> > AND ab.eventId = b.eventId
> > AND b.customerId = c.customerId
> > AND a.agentId = #id#
> >
> > ORDER BY a.agentId,  c.customerId
> > </select>
> >
> > - The returned result set:
> > agentId,agent_firstname,agent_lastname,eventId,title,customerId,customer_firstname,customer_lastname
> >
> >
> > {1,Agent1,Smith,1,housebreaking,1,Customer1,Johnson}
> > {1,Agent1,Smith,4,theft,1,Customer1,Johnson}
> > {1,Agent1,Smith,2,damage,3,Customer2,Miller}
> >
> >
> > What we would like to achieve is getting a bean of type Agent, which
> > contains two lists of all its customers and all its associated
> > insured events:
> >
> > Agent1  --> List<Customer> {1:Customer1, 3:Customer2}
> >            --> List<Event> {1:housebreaking, 2:damage, 4:theft}
> >
> >
> > But iBatis creates a bean like this:
> > Agent1  --> List<Customer> {1: Customer1, 1:Customer1, 3: Customer2}
> >           --> List<Event> {1:housebreaking, 2:damage, 4:theft}
> >
> >
> > We want to avoid several SQL statements to get the necessary data (one
> > to get all events, and one to get all customers).
> >
> > Any solution ?
> >
> >
> >
> >
> >
> >
> >
> >
>

Mime
View raw message