ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Carlos Pita <carlosjosep...@gmail.com>
Subject Re: Handling multiple table aliases in a query using one resultMap.
Date Tue, 01 Sep 2009 06:50:50 GMT
After a closer examination at the implementation of DefaultResultSetHandler
even the original proposal by Iwao doesn't look that hard to get working.

The sequence of execution is as follows:

  handleResultSets(mappedStatement)
    handleResults
      loadResultObject <-------------------------+
         mapResults                              |
            processResult                        |
               processNestedSelectResult         |
               processSimpleResult               |
         processNestedJoinResults ---------------+

Both processSimpleResult and processNestedJoinResults directly
or indirectly call the utility getPrimitiveResultMappingValue,
which ultimately calls the typeHandler passing it the column given by
the resultMapping. So say prefix is a property of mappedStatement,
which is "global" to the entire process, it's just a matter
of prefixing it to resultMapping.getColumn() at
getPrimitiveResultMappingValue. Both top-level mappings and nested
ones (inlined or external) will be affected by this prefix, as desired.

Please correct me if I'm wrong, I'm not familiar with ibatis code.

If I'm right, both alternatives are easily implementable: giving prefix
at use-place or giving it at definition-place. I tend to prefer the
first one.

Best regards
--
Carlos


On Tue, Sep 1, 2009 at 2:36 AM, Carlos Pita<carlosjosepita@gmail.com> wrote:
> Hi all,
>
> I would like to revive this old thread, which is representative of a few
> other ones that can be found in the list with some effort. I understand
> both the original proposal and the difficulty that Jeff pointed out.
> But I think a very simple solution can be implemented if instead of
> "parameterizing" the resultmap passing it a prefix at the point of use,
> a facility is provided to duplicate a resultmap with a different
> prefix using the original one as a template at the point of definition.
> Maybe this can be regarded as a kind of extension to the resultmap:
>
> <resultMap id="PrefixedResultMap" extends="SomeResultMap"
> withPrefix="somePrefix_"/>
>
> This is handy and I think that it brings no complex implementation
> issues along.
>
> I could work on a patch to support this feature, but I would like to hear
> you opinion first.
>
> Best regards
> --
> Carlos
>
>
>
>
>> Jeff Butler
>> Mon, 04 Dec 2006 09:44:51 -0800
>>
>> I understand the issue, and your proposed solution.  I think the
>> implementation could get complex - especially if the referenced result map
>> referenced other result maps.  Result processing is already pretty complex
>> in iBATIS - this would add to that complexity.
>>
>> I'd like to hear from other users to see if this is a big need.  My feeling
>> is that this use case - where you populate different nested objects of the
>> same type from a single query - is pretty rare.
>>
>> Jeff Butler
>>
>>
>>
>> On 12/4/06, Iwao AVE! <[EMAIL PROTECTED]> wrote:
>>
>>     Hi all,
>>
>>     It was a great news that [#IBATIS-225] had been implemented.
>>     I'm wondering if it can be improved a little bit more.
>>
>>     --
>>     Assuming I have 2 simple java classes.
>>     Needless to say, there are corresponding tables in a database.
>>
>>     public class Staff {
>>        Integer id;
>>        String name;
>>        // ... accessor methods
>>     }
>>
>>     public class Section {
>>        Integer sectionId;
>>        Staff manager;
>>        Staff submanager;
>>        // ... accessor methods
>>     }
>>
>>     To retrieve section with its manager and submanager, I will have a query
>>     like below.
>>
>>     <select id="select" resultMap="sectionResult" resultClass="int">
>>     SELECT
>>        section.section_id,
>>        manager.staff_id AS manager_id,
>>        manager.staff_name AS manager_name,
>>        submanager.staff_id AS submanager_staff_id,
>>        submanager.staff_name AS submanager_staff_name
>>     FROM
>>        section,
>>        staff AS manager,
>>        staff AS submanager
>>     WHERE
>>        section.section_id = #value# AND
>>        section.manager_id = manager.staff_id AND
>>        section.submanager_id = submanager.staff_id
>>     </select>
>>
>>     Then I will define the sectionResult resultMap.
>>     Currently, it may have to be like this, I suppose.
>>
>>     <resultMap id="sectionResult" class="sectionClass">
>>        <result property="sectionId" column="section_id"/>
>>        <result property="manager.id" column="manager_staff_id"/>
>>        <result property="manager.name" column="manager_staff_name"/>
>>        <result property="submanager.id" column="submanager_staff_id"/>
>>        <result property="submanager.name" column="submanager_staff_name"/>
>>     </resultMap>
>>
>>     Because both manager and submanager are instances of Staff, wouldn't it
>>     be nice to have a way to map these properties using externaly defined
>>     resultMap? (In my understanding, I can specify resultMap for one of
>>     manager or submanager, but not for both of them, right?)
>>
>>     So, here's my proposal which introduces 'columnPrefix' attribute.
>>     On applying staffResult, iBATIS appends the prefix to the name of each
>>     column.
>>
>>     <resultMap id="sectionResult" class="sectionClass">
>>        <result property="sectionId" column="section_id"/>
>>        <result property="manager" resultMap="staff"
>>                columnPrefix="manager_"/>
>>        <result property="submanager" resultMap="staff"
>>                columnPrefix="submanager_"/>
>>     </resultMap>
>>
>>     <resultMap id="staffResult" class="staffClass">
>>        <result property="id" column="id"/>
>>        <result property="name" column="name"/>
>>     </resultMap>
>>
>>     --
>>     If some of you like it, I will submit new improvement request to JIRA.
>>     Or, if iBATIS already has a way to achieve this, please show me how to
>>     do it.
>>
>>     --
>>     Regards,
>>
>>     Iwao
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org
For additional commands, e-mail: user-java-help@ibatis.apache.org


Mime
View raw message