S2JDBCに対する微妙な要望

書いてる本人が微妙(=あるに越したことはないけど、なくても70%くらいの人は困らないかも)だなぁと思っているので書くのもどうかと思うのだけれど、もしかしたら他にも同じことを考えている人がいるかもしれないので一応。

SimpleWhereだけパッケージが違うのがうざったい

import org.seasar.extension.jdbc.*;

とインポートすると、SimpleWhereだけが使えないのでうざったい。S2JDBC使う場合はほぼ必須だということを考えると、あえてパッケージを分離する必要もないんじゃないかなぁ(〜Whereクラスが今後大量発生するならともかく)。

@Columnで計算式を扱えるようにしてほしい

個人的には結構重要なのだけど、世間的にはそうでもないのかな?(計算などはJava側でやるという方針なのかも)。JPA的にもNGかもしれないので、どうかというのもわからんでもないけど。

例えばこんな感じ(実際にやってみたら「T1_.(dayCount * dayRate)」となり失敗する)。

public Attendance {
    public Integer dayCount;
    public BigDecimal dayRate;

    @Column(name="(dayCount * dayRate)")
    public BigDecimal salery;
}

大量データを扱えるよう、1件ずつデータを処理する機構がほしい

大量データを検索して処理したい時に、ListだとOutOfMemoryErrorが発生させてしまう場合がある。1行づつデータを取ってくるIteratorもほしい気がする。例えばこんな感じ。

// org.seasar.extension.jdbc.SelectにgetResultHandler()を実装
ResultHandler<Employee> handler = jdbcManager.from(Employee.class).getResultHandler();
try {
  for (Employee emp : handler) {
    // handle emp
  }
} finally {
  handler.close();
}

木構造のデータを簡単に構成できるようにしてほしい

例えばこんなテーブル(部署マスタ)があったとする。

ID 上位ID 名前
1 null 本社
2 1 支社A
3 1 支社B
4 3 支社A 1課
5 3 支社B 2課

このとき、おそらくEntityクラスは次のようになる。

public class Department {
    @Id
    public Integer id;

    public Integer parentDepartmentId;

    public String name;

    @ManyToOne
    public Department parantDepartment;

    @OneToMany
    public List<Department> childDepartmentList;
}

本当にほしいのはこの部署のツリー構造なのだが、S2JDBCのJOINを使うと、JOINした回数分の階層しか取得できない。しかし、データ的には1回SELECT文を発行するだけで取ってこれる(同じテーブルなので)。

だから、例えばgetTreeResult()みたいなメソッドを呼ぶと、fromで指定したEntityの自己結合を自動的に解決して、親子を関連付けてほしい。

List<Department> departments = jdbcManager
    .from(Department.class)
    .getTreeResult();

int size = departments.size() // == 1
List<Department> children = departments.get(0).childDepartmentList; // 支社Aと支社Bのリストを取得

#もしかして、S2Dxo使えばできる?