[jpa:41] krank (crank?)

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 4月 26日 (木) 06:00:18 JST


小林 (koichik) です.

オレンジニュースによると,krank なる
プロダクトがあるそうです.

http://code.google.com/p/krank/

なぜか配布ファイルは crank (^^;

ともあれ (JW),SpringJPA 上で利用可能な
DAO フレームワークということで,
Kuina-Dao と同じような位置づけみたいですね.

http://code.google.com/p/krank/wiki/UsingDAO

を見ると,アプローチの仕方は結構違います.
Kuina-Dao はエンティティ毎に Dao インタフェースを
定義するのに対して,krank ではエンティティ毎に
Dao インスタンスを定義するという感じ.
でも,できることはかなり似てます.

krank の

    Employee employee = (Employee) genericDao.read( 1L );

は,Kuina-Dao では

    Employee employee = employeeDao.find( 1L );

になります.
# krank の例,なんでキャストがいるんだろ?

もうちょっと複雑な問い合わせの例.
krank では

    Map<String, Object> params = new HashMap<String, Object>();
    params.put("firstName", "Rick");
    List<Employee> employees = genericDao.find( params, new String[] { "firstName" });

Kuina-Dao では EmployeeDao に

    List<Employee> findByFirstName(String firstName);

といメソッドを用意して

    List<Employee> employees = employeeDao.findByFirstName("Rick");

となります.
この場合,krank では自動的に firstName でソートされるらしい.
Kuina-Dao でソートを指定するなら,Dao のメソッドに

    @Orderby("firstName")

ってアノテーションを付けることになります.
# orderby という名前の引数で指定することも可能.

関連先のプロパティを条件とする場合,krank では

    List<Employee> employees = genericDao.find("department.name", "Engineering");

Kuina-Dao では EmployeeDao に

    List<Employee> findByDepartmentName(String department$name);

というメソッドを用意して

    List<Employee> employees = employeeDao.findByDepartmentName("Engineering");

となります.

もっと複雑な例.

    employees = genericDao.find(
        eq("department.name", "Engineering"),
        or( startsLike("firstName", "Rick"),like("firstName", "Ri"))
    );

Kuina-Dao では EmployeeDao に

    List<Employee> findCondition(ConditionalExpression... cond);

というメソッドを用意して,

    employees = genericDao.find(
        eq("department.name", "Engineering"),
        or( like("firstName", "Rick%"), like("firstName", "%Ri%"))
    );

かなぁ.krank の like() ではワイルドカードを含めていないので,
引数の前後に勝手にワイルドカードが付くと予想.
Kuina-Dao では Dao のメソッドに

    List<Employee> findByFirstName(String firstName_CONTAINS);

とすると,引数で渡した値の前後にワイルドカードを
付けたり,同じように STARTS,ENDS があるのですが,
ConditionalExpression を指定する場合に contains() とか
用意してないことに気がつきました (苦笑).
次のリリースまでに含めることにしよう.

その他,Query by Example や Named Query などなど,
考えることはみんな同じだなぁという感じです.(^^;

大きな違いは,krank は Generic な Dao を提供するのに
対して,Kuina-Dao では個別の Dao インタフェースを
定義してもらうことが前提になってる点でしょう.

昨年秋の Seasar Conference で Kuina-Dao を紹介する
セッションをやったのですが,その後の懇親会で
Generic な Dao を継承して Dao インタフェースを
作れるようにして欲しいという意見を頂いたんですよね.
その時にはあまり魅力的な案だと思えなかったのですが,
採用する方向で考えようかなぁ.
そうすると,

public interface EmployeeDao extends GenericDao<Employee, Integer> {
}

のようにするだけで,find() や persist() などの基本的な
操作は使えるようになります.
とはいえ,krank みたいに GenericDao を直接使うのは
Kuina-Dao の実装ではちょっと無理.


ともあれ (JW),Spring で JPA な人は試してみては
いかがでしょうか.
# Seasar で JPA な人は是非 Kuina-Dao を(笑).


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>




jpa メーリングリストの案内