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