When you're calling "getGamesForChannel", you're specifying the
parameterClass as a String whlie you're passing it a channelID which I am
assuming is an Integer.
Also, regarding this syntax:
<result property="leagueFlags" column="{channelID=channelID,gameID=gameID}"
select="getLeaguesForGame" />
I'm not too sure you can do what you're doing in the column attribute.
Maybe an IBatis team member can jump in and show us how to pass in multiple
values into a select query from a result map.
You also might want to have a look at the "Avoiding N+1 Selects" part in the
documentation but that's after you get this working.
Zarar
----- Original Message -----
From: "Michael Laccetti" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Thursday, November 17, 2005 4:37 PM
Subject: RE: Nested Lists [signed]
So nobody has any ideas?
Mike
-----Original Message-----
From: Michael Laccetti [mailto:[EMAIL PROTECTED]
Sent: November 16, 2005 10:56 PM
To: [email protected]
Subject: Nested Lists [signed]
I've got a bit of a tricky question. I'm trying to retrieve a list of
objects from the database. That's the easy part. The hard part is that
two
properties in the object are also lists. So, when I call the list query,
it
in turn will call two sub-queries to populate the properties. I've read
about doing it, and thought that I knew what to do, but I cannot make it
work. The other problem is that no actual exceptions get thrown. If I
wasn't debugging the app I would have never even noticed it (aside from a
lack of objects in the lists).
Here are links to two screenshots that will show you the exceptions:
(Note: they're somewhat large, I apologize in advance.)
http://images.nihilist.ca/gallery/main.php?g2_view=core.ShowItem&g2_itemId=6
6&g2_imageViewsIndex=2&g2_navId=xb4c396b6
http://images.nihilist.ca/gallery/main.php?g2_view=core.ShowItem&g2_itemId=7
0&g2_imageViewsIndex=2&g2_navId=xb4c396b6
Here is the actual configuration for everything. The query starts at the
bottom, the statement with id getChannelInformation. That then calls
getLeaguesForGame and getLocationsForGame. It is also attempting to pass
in
two properties, though I do not know if I've got it right, or got it at
all.
I'm trying to pass in the channel ID, but that's from the first query, and
I
do not know if it propagates properly.
<resultMap id="get-locations-for-game" class="java.lang.String">
<result property="value" column="flag_location" />
</resultMap>
<statement id="getLocationsForGame" resultMap="get-locations-for-game">
SELECT
flag_location
FROM
scrimbot_location
WHERE
id IN (
SELECT
scrimbot_channel_games.scrim_location_id
FROM
scrimbot_channels
INNER JOIN
scrimbot_channel_games ON
(scrimbot_channels.id=scrimbot_channel_games.channel_id)
WHERE
scrimbot_channels.channel = '#channelID#'
AND
scrimbot_channel_games.game_id=#gameID#
)
</statement>
<resultMap id="get-leagues-for-game" class="java.lang.String">
<result property="value" column="league" />
</resultMap>
<statement id="getLeaguesForGame" resultMap="get-leagues-for-game">
SELECT
scrimbot_leagues.league
FROM
scrimbot_leagues
WHERE
id IN (
SELECT
scrimbot_channel_games.league_id
FROM
scrimbot_channels
INNER JOIN
scrimbot_channel_games ON (scrimbot_channels.id =
scrimbot_channel_games.channel_id)
WHERE
scrimbot_channels.channel = '#channelID#'
AND
scrimbot_channel_games.game_id=#gameID#
)
</statement>
<resultMap id="get-games-for-channel" class="game">
<result property="gameID" column="gameID" />
<result property="gameFlag" column="game"/>
<result property="gametypeID" column="gametypeID"/>
<result property="gametypeFlag" column="gametype"/>
<result property="leagueFlags"
column="{channelID=channelID,gameID=gameID}" select="getLeaguesForGame" />
<result property="locationFlags"
column="{channelID=channelID,gameID=gameID}" select="getLocationsForGame"
/>
</resultMap>
<statement id="getGamesForChannel" resultMap="get-games-for-channel"
parameterClass="java.lang.String">
SELECT
scrimbot_games.id as gameID,
scrimbot_games.game,
scrimbot_gametypes.id as gametypeID,
scrimbot_gametypes.gametype,
scrimbot_channels.id as channelID
FROM
scrimbot_channels
INNER JOIN
scrimbot_channel_games ON
(scrimbot_channels.id=scrimbot_channel_games.channel_id)
INNER JOIN
scrimbot_games ON
(scrimbot_channel_games.game_id=scrimbot_games.id)
INNER JOIN
scrimbot_gametypes ON
(scrimbot_channel_games.gametype_id=scrimbot_gametypes.id)
WHERE
scrimbot_channels.channel = #value#
</statement>
<resultMap id="get-channel-info" class="channel">
<result property="channelID" column="id"/>
<result property="channel" column="channel"/>
<result property="channelLocation" column="location"/>
<result property="owner" column="username" />
<result property="ownerEmail" column="emailaddress" />
<result property="dateAdded" column="date_added" />
<result property="games" column="channelID"
select="getGamesForChannel"/>
</resultMap>
<statement id="getChannelInformation" resultMap="get-channel-info">
SELECT
scrimbot_channels.id,
scrimbot_channels.channel,
scrimbot_channels.date_added,
gg_users.username,
gg_users.emailaddress,
scrimbot_location.flag_location as location,
FROM
scrimbot_channels
INNER JOIN
scrimbot_location ON
(scrimbot_channels.location=scrimbot_location.id)
INNER JOIN
gg_users ON (scrimbot_channels.owner=gg_users.userID)
WHERE
scrimbot_channels.channel='#value#'
</statement>
So, if anybody can shed some light on what I'm doing wrong, or not doing
at
all, I'd appreciate it.
Mike