Thanks for reply.
Null's seem to be the cause of the problem. Can iBatis handle the case where
the value of attributes in a join are mapped to non-leaf complex objects? e.g
If I have complex objects like this:
class A
{
int ID {}
IList<B> Bees { ... }
}
class B
{
int ID {}
IList<C> Cees { ... }
}
class C
{
int ID {}
IList<D> Dees { ... }
}
Then these result sets are OK:
A_ID B_ID C_ID D_ID
1 1 1 1
2 2 2 NULL
But these will throw:
A_ID B_ID C_ID D_ID
1 1 NULL NULL
A_ID B_ID C_ID D_ID
1 NULL NULL NULL
Patrick
________________________________
From: Jérome Avoustin [mailto:[EMAIL PROTECTED]
Sent: Monday, July 28, 2008 2:08 AM
To: [email protected]
Subject: RE: Problem mapping join on many tables to complex objects
Hi Patrick,
Excuse me for being so "easy", but maybe it's because of your left join
?
It may return sometimes an "null Session" in your data, so that iBatis
can't map it to an object !
You may activate log4net and Debug level for IBatisNet Logger to see
your statements.
Found on the iBatis.Net online documentation :
"Lazy Loading vs. Joins (1:1)
It's important to note that using a join is not always better. If you
are in a situation where it is rare to access the related object (e.g. the
category property of the Product class) then it might actually be faster to
avoid the join and the unnecessary loading of all category properties. This is
especially true for database designs that involve outer joins or nullable
and/or non-indexed columns. In these situations it might be better to use the
sub-select solution with lazy loading enabled. The general rule of thumb is:
use the join if you're more likely going to access the associated properties
than not. Otherwise, only use it if lazy loading is not an option.
If you're having trouble deciding which way to go, don't worry. No
matter which way you go, you can always change it without impacting your
application source code. Example 3.40 and 3.41 result in exactly the same
object graph and are loaded using the exact same method call from the
application. The only consideration is that if you were to enable caching, then
the using the separate select (not the join) solution could result in a cached
instance being returned. But more often than not, that won't cause a problem
(your application shouldn't be dependent on instance level equality i.e. "==").
»
Hope this helps ! J
Jérôme Avoustin
-----Message d'origine-----
De : Patrick Griffiths [mailto:[EMAIL PROTECTED]
Envoyé : samedi 26 juillet 2008 01:54
À : [email protected]
Objet : Problem mapping join on many tables to complex objects
I'm trying to map from a single statement that joins 4 tables into a
deep complex object layout. The result maps look like this:
<resultMap id="session-result" class="Session" groupBy="SessionID">
<result property="SessionID" column="Session_SessionID"/>
<!-- Rest omitted for brevity -->
</resultMap>
<resultMap id="class-result" class="TrainingEvent" groupBy="ClassID">
<result property="ClassID" column="Class_ClassID"/>
<result property="Sessions"
resultMapping="SessionSqlMap.session-result" />
<!-- Rest omitted for brevity -->
</resultMap>
<resultMap id="course-result" class="TrainingActivity"
groupBy="CourseID">
<result property="CourseID" column="Course_CourseID"/>
<result property="TrainingEvents"
resultMapping="TrainingEventSqlMap.class-result"/>
<!-- Rest omitted for brevity -->
</resultMap>
<resultMap id="company-result" class="Company" groupBy="CompanyID">
<result property="CompanyID" column="Company_CompanyID"/>
<result property="TrainingActivities"
resultMapping="CourseSqlMap.course-result"/>
<!-- Rest omitted for brevity -->
</resultMap>
and the SQL is:
SELECT /* fields omitted for brevity */
FROM Company c INNER JOIN
Course cr ON c.CompanyID = cr.CompanyID LEFT JOIN
Class cl ON cr.CourseID = cl.CourseID LEFT JOIN
Session s ON cl.SessionID = cl.SessionID
iBatis has no problem mapping the Company, Course and Class fields into
the complex object structure, but it throws a NullReferenceException
when it tries to map the fields from the Session table - even when I use
the very simple abbreviated result maps above.
Any help identifying where I'm going wrong would be much appreciated.
Thanks.