I agree with Brandon - a list of addresses would be better.  You've got a
properly normalized DB and a de-normalized object model.  Usually it's the
other way around!

However, you can accompish what you want in a single SQL statement.
Assuming tables like this:

create table customer (
 customerId int not null,
 firstName varchar(30),
 lastName varchar(30),
 primary key(customerId)
)

create table address (
 customerId int not null,
 addressType int not null,
 city varchar(30),
 state char(2),
 zip char(5),
 primary key(customerId, addressType)
)


You could write an SQL statement like this:

select c.customerId, c.firstName, c.lastName,
 a1.city as a1_city, a1.state as a1_state, a1.zip as a1_zip,
 a2.city as a2_city, a2.state as a2_state, a2.zip as a2_zip,
 a3.city as a3_city, a3.state as a3_state, a3.zip as a3_zip
from customer c
 left join address a1
   on c.customerId = a1.customerId and a1.addressType = 1
 left join address a2
   on c.customerId = a2.customerId and a2.addressType = 2
 left join address a3
   on c.customerId = a3.customerId and a3.addressType = 3

Jeff Butler
On 2/14/07, Thibaut Fagart <[EMAIL PROTECTED]> wrote:


Thanks for the tip but I'm not happy with this solutions, because in my
case
the 3 addresses have different meanings (just as you would have a main
address and secondary ones).

I'm trying to create a use case for what I'm trying to do, will post it
later today or tomorrow


Brandon Goodin wrote:
>
> It could be solved if you combined address1,2,3 into a list and used the
> groupby functionality.
>
> Customer {
>         firstName : string
>         lastName : string
>         addresses : List
> }
>
> If you want to return the address through address1, 2, 3 getters you
could
> always add the getters and have them draw from the list indexes.
>
> getAddress1() {
>   if (addresses.getSize() > 0) return addresses.get(0) : return null;
> }
>
> getAddress2() {
>   if (addresses.getSize() > 1) return addresses.get(1) : return null;
> }
>
> getAddress3() {
>   if (addresses.getSize() > 2) return addresses.get(2) : return null;
> }
>
>
>
> Brandon
>
> On 2/14/07, Thibaut Fagart <[EMAIL PROTECTED]> wrote:
>>
>>
>> Hi,
>> I'm currently evaluating IBatis for the corporation I work with, and
>> trying
>> to use it to solve a case we have.
>>
>> We have a model like this
>>
>> Customer {
>>         firstName : string
>>         lastName : string
>>         address1 : Address
>>         address2 : Address
>>         address3 : Address
>> }
>> where Address is a simple class.
>>
>> All the addresses happen to be stored in the same table, with a join to
>> the
>> customer table, and a flag indicating which address this is (address1,
>> address2 or address3).
>>
>> The request that used to be used to solve this case is something like
>> that
>>
>> select [customer columns], [address columns], address_flag  from
>> customer,
>> address
>> where customer.id = address.id_customer
>>
>> This would return 3 rows, with the curstomer information duplicated,
and
>> the
>> resultSet consuming code would sort out which address attributes
>> (address1,
>> address2 or address3) has to be set with the current row depending on
>> address_flag value.
>>
>> I've seen support for returning heterogenous lists using the
>> discriminator
>> tag, but this doesn't solve my problem, does it ?
>>
>> Would there be a way to solve this case with only 1 request to the
>> database
>> ?
>> --
>> View this message in context:
>>
http://www.nabble.com/howto-%3A-Degenerated-case-of-heterogenous-lists.-tf3227674.html#a8966314
>> Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
>>
>>
>
>

--
View this message in context:
http://www.nabble.com/howto-%3A-Degenerated-case-of-heterogenous-lists.-tf3227674.html#a8967489
Sent from the iBATIS - User - Java mailing list archive at Nabble.com.


Reply via email to