And with

class A,B,C,D {
Nullable<int> ID { ... }
...
}

?




2008/7/28 Patrick Griffiths <[EMAIL PROTECTED]>:
>
> 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