You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Collin Peters <ca...@gmail.com> on 2007/03/15 16:54:08 UTC

Is it possible to have an optional property in resultMap?

Hi everyone,

I'm just wondering if it is possible to have an optional property in a
resultMap?  For example, I have a UserVO class which I use to load
users into.  It has fields such as user_id, username, firstname,
lastname, password, etc...  I also want to use this class as a
'sub'-resultMap from another call.  For example, I have a call called
loadDailySchedule, in this call I grab all events in a schedule, along
with all the participants, and group by the event_id.  So the sqlmap
is:

	<resultMap id="eventResult" class="EventVO" groupBy="eventID">
		<result property="eventID" column="event_id" />
		<result property="summary" column="summary" />
<snip...>
		<result property="participants" resultMap="common.userResult" />
	</resultMap>

The problem is that I don't want to have to include fields like the
users password in this query as it is not needed.  If I want to use
the common.userResult resultMap (which uses the UserVO class) though,
I need to include those fields otherwise I get the error: "The column
name password was not found in this ResultSet"

Regards,
Collin

Re: Is it possible to have an optional property in resultMap?

Posted by Jeff Butler <je...@gmail.com>.
You could do two things:

1. Hava a BaseUserVO and FullUserVO that extends BaseUserVO.  Write seperate
result maps and use as appropriate

2. Have UserVO as now, but write two different resultMaps - a base resultMap
and a full resultMap that extends the base resultMap.  Then specify the
appropriate resultMap on the different queries.

I've done both at different times, but sounds like #2 is more appropriate in
your situation.

iBATIS does not support optional attributes now.

Jeff Butler



On 3/15/07, Collin Peters <ca...@gmail.com> wrote:
>
> The whole point is that I don't want to include the extra SQL fields
> at all, and still only have one resultMap class.
>
> In my entire application I only want to ever have one class that
> represents a user (called UserVO).  So I would have a sqlmap called
> getUser where I pass in an ID and get *all* the details for that user.
> Then I have another sqlmap called getAppointments which gets a bunch
> of appointments, and all the participants in each appointment.  For
> the participants, they can be stored in a UserVO, but I don't want to
> retrieve their password and other extraneous fields that aren't
> important to being a participant in an appointment.
>
> Currently in iBatis when I specify the participants of an appointment like
> this:
>        <resultMap id="eventResult" class="EventVO" groupBy="eventID">
>                <result property="eventID" column="event_id" />
>                <result property="summary" column="summary" />
> <snip....>
>                <result property="participants" resultMap="userResult" />
>        </resultMap>
>        <resultMap id="userResult" class="UserVO" >
>                <result property="userID" column="user_id"/>
>                <result property="password" column="password"/>
> <snip...>
>        </resultMap>
>
> iBatis will error because I am not including the password in the SQL
> to get the appointments.  So my options I see so far are:
> - include the extra user fields in the SQL
> - create a new object class called ParticipantUserVO without the extra
> fields
> - any others?
>
> What I was hoping is there was some way to specify a property in a
> resultMap as optional.  So that when constructing the object if it
> failed to find that column it would simply set it as null and continue
> on its merry way instead of failing.  Am I making sense?
>
> On 3/15/07, Larry Meadors <lm...@apache.org> wrote:
> > You could use dynamic SQL to do that, just make the password '' in the
> > cases you don't want it.
> >
> > <select...>
> > select ...
> > <isEqual property="showPassword" compareValue="true">password</isEqual>
> > <isEqual property="showPassword" compareValue="false">'' as
> password</isEqual>
> > ...
> > </select>
> >
> > Larry
> >
> >
> > On 3/15/07, Collin Peters <ca...@gmail.com> wrote:
> > > Hi everyone,
> > >
> > > I'm just wondering if it is possible to have an optional property in a
> > > resultMap?  For example, I have a UserVO class which I use to load
> > > users into.  It has fields such as user_id, username, firstname,
> > > lastname, password, etc...  I also want to use this class as a
> > > 'sub'-resultMap from another call.  For example, I have a call called
> > > loadDailySchedule, in this call I grab all events in a schedule, along
> > > with all the participants, and group by the event_id.  So the sqlmap
> > > is:
> > >
> > >         <resultMap id="eventResult" class="EventVO" groupBy="eventID">
> > >                 <result property="eventID" column="event_id" />
> > >                 <result property="summary" column="summary" />
> > > <snip...>
> > >                 <result property="participants" resultMap="
> common.userResult" />
> > >         </resultMap>
> > >
> > > The problem is that I don't want to have to include fields like the
> > > users password in this query as it is not needed.  If I want to use
> > > the common.userResult resultMap (which uses the UserVO class) though,
> > > I need to include those fields otherwise I get the error: "The column
> > > name password was not found in this ResultSet"
> > >
> > > Regards,
> > > Collin
> > >
> >
>

Re: Is it possible to have an optional property in resultMap?

Posted by Collin Peters <ca...@gmail.com>.
The whole point is that I don't want to include the extra SQL fields
at all, and still only have one resultMap class.

In my entire application I only want to ever have one class that
represents a user (called UserVO).  So I would have a sqlmap called
getUser where I pass in an ID and get *all* the details for that user.
 Then I have another sqlmap called getAppointments which gets a bunch
of appointments, and all the participants in each appointment.  For
the participants, they can be stored in a UserVO, but I don't want to
retrieve their password and other extraneous fields that aren't
important to being a participant in an appointment.

Currently in iBatis when I specify the participants of an appointment like this:
	<resultMap id="eventResult" class="EventVO" groupBy="eventID">
		<result property="eventID" column="event_id" />
		<result property="summary" column="summary" />
<snip....>
		<result property="participants" resultMap="userResult" />
	</resultMap>
	<resultMap id="userResult" class="UserVO" >
		<result property="userID" column="user_id"/>
		<result property="password" column="password"/>
<snip...>
	</resultMap>

iBatis will error because I am not including the password in the SQL
to get the appointments.  So my options I see so far are:
- include the extra user fields in the SQL
- create a new object class called ParticipantUserVO without the extra fields
- any others?

What I was hoping is there was some way to specify a property in a
resultMap as optional.  So that when constructing the object if it
failed to find that column it would simply set it as null and continue
on its merry way instead of failing.  Am I making sense?

On 3/15/07, Larry Meadors <lm...@apache.org> wrote:
> You could use dynamic SQL to do that, just make the password '' in the
> cases you don't want it.
>
> <select...>
> select ...
> <isEqual property="showPassword" compareValue="true">password</isEqual>
> <isEqual property="showPassword" compareValue="false">'' as password</isEqual>
> ...
> </select>
>
> Larry
>
>
> On 3/15/07, Collin Peters <ca...@gmail.com> wrote:
> > Hi everyone,
> >
> > I'm just wondering if it is possible to have an optional property in a
> > resultMap?  For example, I have a UserVO class which I use to load
> > users into.  It has fields such as user_id, username, firstname,
> > lastname, password, etc...  I also want to use this class as a
> > 'sub'-resultMap from another call.  For example, I have a call called
> > loadDailySchedule, in this call I grab all events in a schedule, along
> > with all the participants, and group by the event_id.  So the sqlmap
> > is:
> >
> >         <resultMap id="eventResult" class="EventVO" groupBy="eventID">
> >                 <result property="eventID" column="event_id" />
> >                 <result property="summary" column="summary" />
> > <snip...>
> >                 <result property="participants" resultMap="common.userResult" />
> >         </resultMap>
> >
> > The problem is that I don't want to have to include fields like the
> > users password in this query as it is not needed.  If I want to use
> > the common.userResult resultMap (which uses the UserVO class) though,
> > I need to include those fields otherwise I get the error: "The column
> > name password was not found in this ResultSet"
> >
> > Regards,
> > Collin
> >
>

Re: Is it possible to have an optional property in resultMap?

Posted by Larry Meadors <lm...@apache.org>.
You could use dynamic SQL to do that, just make the password '' in the
cases you don't want it.

<select...>
select ...
<isEqual property="showPassword" compareValue="true">password</isEqual>
<isEqual property="showPassword" compareValue="false">'' as password</isEqual>
...
</select>

Larry


On 3/15/07, Collin Peters <ca...@gmail.com> wrote:
> Hi everyone,
>
> I'm just wondering if it is possible to have an optional property in a
> resultMap?  For example, I have a UserVO class which I use to load
> users into.  It has fields such as user_id, username, firstname,
> lastname, password, etc...  I also want to use this class as a
> 'sub'-resultMap from another call.  For example, I have a call called
> loadDailySchedule, in this call I grab all events in a schedule, along
> with all the participants, and group by the event_id.  So the sqlmap
> is:
>
>         <resultMap id="eventResult" class="EventVO" groupBy="eventID">
>                 <result property="eventID" column="event_id" />
>                 <result property="summary" column="summary" />
> <snip...>
>                 <result property="participants" resultMap="common.userResult" />
>         </resultMap>
>
> The problem is that I don't want to have to include fields like the
> users password in this query as it is not needed.  If I want to use
> the common.userResult resultMap (which uses the UserVO class) though,
> I need to include those fields otherwise I get the error: "The column
> name password was not found in this ResultSet"
>
> Regards,
> Collin
>

Re: Is it possible to have an optional property in resultMap?

Posted by Stefan Langer <ma...@googlemail.com>.
Collin Peters schrieb:
> Hi everyone,
>
> I'm just wondering if it is possible to have an optional property in a
> resultMap?  For example, I have a UserVO class which I use to load
> users into.  It has fields such as user_id, username, firstname,
> lastname, password, etc...  I also want to use this class as a
> 'sub'-resultMap from another call.  For example, I have a call called
> loadDailySchedule, in this call I grab all events in a schedule, along
> with all the participants, and group by the event_id.  So the sqlmap
> is:
>
>     <resultMap id="eventResult" class="EventVO" groupBy="eventID">
>         <result property="eventID" column="event_id" />
>         <result property="summary" column="summary" />
> <snip...>
>         <result property="participants" resultMap="common.userResult" />
>     </resultMap>
>
> The problem is that I don't want to have to include fields like the
> users password in this query as it is not needed.  If I want to use
> the common.userResult resultMap (which uses the UserVO class) though,
> I need to include those fields otherwise I get the error: "The column
> name password was not found in this ResultSet"
>
> Regards,
> Collin
>
You could build a result hierarchy so that userResult and eventResult 
inherit their common field from a resultmap abstractUserResult or the like.

Hope I made myself clear

Stefan