Hello, I'm attempting to map an ArrayList<SuperClass> typed property and populate it with instances of SubClassFoo and SubClassBar from the database.
In my query I LEFT JOIN, and then check for NULL primary key values to determine which type of SubClass each row represents. Then I use a <discriminator> and <subMaps> to delegate each row type to the appropriate mapping. I also groupBy my containing object's ID to get all SubClassFoo and SubClassBar objects into the ArrayList<SuperClass> together. Only problem is, it's not working as expected. iBATIS returns an ArrayList containing two instances of my containing class. One instance contains all the SubClassFoo instances, and the other the SubClassBar instances. Anyone know how I can achieve a heterogeneous list? I'm trying to leverage the sorting capabilities of the database, otherwise I'd just use two SELECTs, one for each type. Simplified code below, where Foo and Bar are subclasses of Super. <sqlMap namespace="Example"> <resultMap class="Container" id="root" groupBy="id"> <result property="id" column="id"/> <discriminator javaType="String" column="entity_type"> <subMap value="foo" resultMap="fooSub"/> <subMap value="bar" resultMap="barSub"/> </discriminator> </resultMap> <resultMap id="fooSub" class="Container" extends="root"> <result property="arrayListOfSuper" resultMap="fooMap"/> </resultMap> <resultMap id="barSub" class="Container" extends="root"> <result property="arrayListOfSuper" resultMap="barMap"/> </resultMap> <resultMap id="fooMap" class="Foo"> <result property="id" column="id"> <result property="name" column="name"> </resultMap> <resultMap id="barMap" class="Bar"> <result property="id" column="id"> <result property="name" column="name"> </resultMap> <statement id="getContainer" resultMap="root"> SELECT containers.id_container, foos.id, foos.name, bars.id, bars.name, CASE WHEN foos.id IS NULL THEN 'foo' WHEN bars.id IS NULL THEN 'bar' END AS entity_type FROM containers LEFT JOIN foos USING(id_container) LEFT JOIN bars USING(id_container) WHERE containers.id_container = 1 AND ( foos.id IS NOT NULL OR bars.id IS NOT NULL) </statement> </sqlMap> Thoughts? Thanks, - Daniel