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.

         

         

         

         

         

         

         

         

         

         

         

         

Reply via email to