何か着ていればいいよ

ソフトウェア技術者の日常や技術の話を書こうと思います。

S2Dao.NetでTable定義と異なるEntityを使う方法

Seasar.NetのS2Dao.NetでDaoにSql属性を付与してSelect文を書きたかったのだけど、Entityとは異なる(複数テーブルをJoinした)形で書きたかったのでその方法をメモ。

例えば、こんなSQL

select 
  t1.id,
  t21.value option_value,
  t22.value additional_value
from 
  tabel1 t1
  left outer join tabel2 t21 on (t1.id = t21.id and t21.type='1')
  left outer join tabel2 t22 on (t1.id = t22.id and t22.type='2')

このようなものはEntityクラスにRelkeys属性を振って表現するのが困難です。
上記のSELECT句をVIEWにしてもよいのですが、table2.typeに指定する値をプログラムで一括定義しておきたいのであまりDB側で値に意味を持たせたくありません。

そこでやったこと
EntityのTable属性に適当なテーブル(この例ならtable2とか)を割り振った以下のようなクラスを作ります。

    [Table("table2")]
    public class TablleView
    {
        public int Id { get; set; }
        public int OptionValue { get; set; }
        public int AdditionalValue { get; set; }
    }

そして、上記のTaleViewクラスをBean属性に定義したDaoインターフェイスで最初のSQLSql属性に書いてあげればTableViewクラスを値として取得できます。
ただし、EntityとDB上の定義が異なるのでWarnレベルの警告がログにでます。