[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 メーリングリストの案内