[seasar-s2dao-dev:77] Re: Next S2Dao
Yasuo Higa
higa @ isid.co.jp
2006年 12月 22日 (金) 14:49:21 JST
ひがです。
> 久保です。
>
> > ・JavaBeans(DTO)にJoinアノテーションを指定できるようにする。
> > @Join("dept")
> > public class EmployeeDto extends Employee {
> > private String deptName;
> > private String loc;
> > ...
> > }
>
> ちょっと技術詳細に話が変わりますが(こっちが本題!?)、
>
> 今まで、Employee側(Entityの本体)で、RELKEYなどで、
> 結合先がEntityで静的になってしまっていたので、
> 上記の仕様はかなり利便性がUPする思います。
>
> 複数のテーブルをJOINして、結合先の列を取得したい場合は、
> どうイメージされていますでしょうか?
> (例えば、「@Join("dept, dept2, dept3...")」とか)
>
AAAテーブル
id
aaa_name
bbb_id
version_no
BBBテーブル
id
bbb_name
ccc_id
version_no
CCCテーブル
id
ccc_name
version_no
のような関連のテーブルがあった場合、
class Aaa {
private Integer id;
private String aaaName;
private Integer bbbId;
private Integer versionNo;
...
}
@Join(table="bbb", joins=@Join(table="ccc"))
class AaaDto extends Aaa {
private String bbbName;
private Integer bbbVersionNo;
private String cccName;
private Integer cccVersionNo;
...
}
のように記述すると次のようなSELECT文を自動的に組み立てます。
SELECT id, aaaName, bbb_id as bbbId, bbb_name as bbbName,
bbb.version_no as bbbVersionNo, ccc_name as cccName,
ccc.version_no as cccVersionNo
FROM aaa inner join bbb on aaa.bbb_id = bbb.id
inner join ccc on bbb.ccc_id = ccc.id;
カラム名の_の処理は自動的に行います。
Joinの種類のデフォルトは、INNERになります。
変えたいときは、@Join(table="bbb", type=JoinType.LEFT_OUTER)
のように指定します。
on aaa.bbb_id = bbb.idは、どのようなロジックで組み立てたのでしょうか。
@Join(table="bbb"が指定されているので、BBBテーブルのプライマリーキーは、
idと言うことが分かります。
今度は、AAAテーブルにテーブル名_プライマリーキーのカラム名がないか
探します。bbb_idが存在するので、on aaa.bbb_id = bbb.idが
正しいと判断するのです。
bbbVersionNoがどうしてBBBテーブルのversion_noカラムという判定が
できるかというと、@Joinアノテーションの情報から
テーブル名_カラム名のものを探すためです。
AAAテーブル
id
aaa_name
bbb_id
ccc_id
version_no
BBBテーブル
id
bbb_name
version_no
CCCテーブル
id
ccc_name
version_no
のようにAAAテーブルとCCCテーブルを結合させる場合は、
@Joins({
@Join(table="bbb")
@Join(table="ccc")
})
のように記述します。
どのカラムを結合させるのか自動では判断できないときは、
Joinアノテーションのon属性を使います。
Yasuo Higa
The Seasar Project
seasar-s2dao-dev メーリングリストの案内