ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ted Schrader" <teds.mailing.li...@gmail.com>
Subject Re: Problem creating nested HashMaps using <result property="" column="" select=""/>
Date Wed, 28 Mar 2007 19:04:18 GMT
Ah, so the hashtables are simply used as buckets in a very limited,
direct scope, i.e. iBATIS --> JasperReports.  That's not so bad;
similar to using Maps as parameter objects to iBATIS.  I wouldn't
consider this to be a domain model.

I wish my situation was different:  instead of an OrderVO object, I
have to deal with Hashtable.  Instead of ItemVO, I deal with
Hashtable.  Instead of UserVO, you guessed it...Hashtable.  Ugh.
"Trashtable", indeed.

Good job figuring this out and avoiding the N+1 select, to boot.

Ted

On 28/03/07, Utkarsh Ahuja <ahuja.utkarsh@gmail.com> wrote:
> Dear Ted,
>
> The hashtables in hashtables sounds like a really really bad idea
> ....:)....I can totally see that :). The Pojo's do seem to be the best way
> to go and for the most part thats what I have been doing (The tried and
> tested ofcourse). I am doing this as we want to create an independent
> application that hits the same relational database however, we want to be
> able to extract whatever we want from it without being tied down to the
> POJO's(JasperReports) . Simply to eliminate the need for maintenance.
>
> I did try to use XML earlier using ibatis but that did not work out too well
> and it was really slow when I provided an xml document to JasperReports as a
> datasource.
>
> However, I did figure something out late last night. The way to do it is
> something like this. Using groupBy and the resultMap and using a join in the
> select statement
>
>    <resultMap id="parentResultMap" class="java.util.HashMap"
> groupBy="parentProperty1,parentProperty2,parentProperty3,parentProperty4,parentProperty5"
> >
>         <result column="parent_property_1" property="parentProperty1" />
>         <result column="parent_property_2" property="parentProperty2" />
>         <result column="parent_property_3" property="parentProperty3" />
>         <result column="parent_property_4" property="parentProperty4" />
>         <result column="parent_property_5" property="parentProperty5" />
>         <result property="children" javaType="java.util.List"
> resultMap="namespace.childResultMap"/>
>     </resultMap>
>
>    <resultMap id="childResultMap" class=" java.util.HashMap">
>         <result column="child_property_1" property="childProperty1" />
>         <result column="child_property_2" property="childProperty2" />
>         <result column="child_property_3" property="childProperty3" />
>         <result column="parent_property_1" property="parentProperty1" />
>     </resultMap>
>
> <select id="parentChildMapReport" parameterClass="java.util.HashMap"
> resultMap="parentResultMap">
>         select
>             p.parent_property_1,
>             p.parent_property_2 ,
>             p.parent_property_3,
>             p.parent_property_4,
>             p.parent_property_5,
>             c.child_property_1,
>             c.child_property_2,
>             c.child_property_3 ,
>             c.parent_property_1
>         from parent p, child c
>         where p.parent_property_1 = c.parent_property_1
>     </select>
>
> This worked and did solve our problem where we could just have a generic
> object to hold the results and we were able to pass it as a datasource to
> jasper reports. Performance wise hashtables work really really well(with
> JasperReports).
>
> Thanks
> Utkarsh
>
>
>
> On 3/28/07, Ted Schrader <teds.mailing.lists@gmail.com> wrote:
> > I'm not sure about the ultimate answer, but I'm also not sure the
> > following is valid:
> >
> > <result column="parent_column_1" property="children"
> > resultMap="childResultMap" select="loadChildren"/>
> >
> > I believe the "resultMap" and "select" attributes are mutually
> > exclusive  ("resultMap" for avoiding N+1 selects, and "select" for
> > sub-selects, which in turn have their own resultMaps).
> >
> > Also, at risk of hijacking the thread, I just have to throw in my two
> cents:
> >
> > Call me a coward, but hashtables inside hashtables as a domain model
> > frightens the living daylights out of me.  We've just inherited a web
> > app that uses this "design pattern" and we quickly bestowed the
> > honorable title of "trashtable" to the idiom.  Perhaps I'm just
> > entrenched in my ways, but I prefer POJOs and the ability to really
> > lean on the compiler (thus my biggest gripe about JSP/Struts tags).  I
> > would love to hear about any compelling arguments for the hash-in-hash
> > model in an off-topic thread.
> >
> > Ted
> >
> > On 27/03/07, Utkarsh Ahuja <ahuja.utkarsh@gmail.com > wrote:
> > > Hi,
> > > I am trying to create nested HashMaps something like
> > >
> > > ParentHashMap {
> > >      ...... some key value pairs
> > >      ......
> > >      childHashMap....some key value pairs
> > > }
> > >
> > > I am doing the following:
> > >
> > >      <resultMap id="parentResultMap" class="java.util.HashMap">
> > >         <result column="parent_column_1" property="parentColumn1" />
> > >         <result column="parent_column_1" property="parentColumn2" />
> > >         <result column="parent_column_1" property="parentColumn3" />
> > >         <!-- customizations -->
> > >         <result column="parent_column_1" property="children"
> > > resultMap="childResultMap" select="loadChildren"/>
> > >     </resultMap>
> > >
> > >     <select id="loadParent" parameterClass=" java.util.HashMap"
> > > resultMap="parentResultMap">
> > >         select
> > >             parent_column_1,
> > >             parent_column_2,
> > >              parent_column_3
> > >         from parent
> > >     </select>
> > >
> > >     <resultMap id="childResultMap" class="java.util.HashMap">
> > >         <result column="child_column_1" property="childColumn1" />
> > >         <result column="child_column_2" property="childColumn2" />
> > >         <result column="child_column_3" property="childColumn3" />
> > >         <result column="parent_column_1" property="parentColumn1" />
> > >     </resultMap>
> > >
> > >     <select id="loadChildren" resultMap="childResultMap">
> > >         select
> > >            child_column_1,
> > >            child_column_2,
> > >            child_column_3,
> > >             parent_column_1
> > >          from child
> > >         where parent_column_1 = #parentColumn1:VARCHAR#
> > >     </select>
> > >
> > > Can iBatis instantiate and create a HashMap within another HashMap and
> use
> > > the property element as the key for it ?
> > > <result column="parent_column_1" property="children"
> > > resultMap="childResultMap" select="loadChildren"/>
> > >
> > > Thanks
> > > Utkarsh
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> >
>
>

Mime
View raw message