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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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
>
>
>
>
>
>
>
>