s2hibernate.daoのdto対応について

s2jsf-exampleのs2daos2hibernate.daoに差し替えた版を作成中なのですが、
従業員検索のEmployeeDtoDao.javaの次の記述とSQLファイルの部分をどうしようかなぁと思い。


public String searchEmployeeDtoList_ARGS = "dto";

public List searchEmployeeDtoList(EmployeeSearchDto dto);

対応するEmployeeDtoDao_searchEmployeeDtoList.sql

select empno,ename,job,mgr,hiredate,
sal,comm,deptno,d.dname
from emp e left outer join dept d on e.deptno = d.deptno
/*BEGIN*/
where
/*IF dto.empno != null*/and empno = /*dto.empno*/7788/*END*/
/*IF dto.ename != null*/and ename = /*dto.ename*/'SCOTT'/*END*/
/*IF dto.job != null*/and job = /*dto.job*/'ANALYST'/*END*/
/*IF dto.mgr != null*/and mgr = /*dto.mgr*/7566/*END*/
/*IF dto.fromHiredate != null*/and hiredate >= /*dto.fromHiredate*/'1982-12-01'/*END*/
/*IF dto.toHiredate != null*/and hiredate <= /*dto.toHiredate*/'1982-12-31'/*END*/
/*IF dto.fromSal != null*/and sal >= /*dto.fromSal*/1000/*END*/
/*IF dto.toSal != null*/and sal <= /*dto.toSal*/4000/*END*/
/*IF dto.deptno != null*/and deptno = /*dto.deptno*/20/*END*/
/*END*/


次のような記述で動作する様な実装をしてみています。


// public String searchEmployeeDtoList_ARGS = "dto";
public String searchEmployeeDtoList_PROPERTY = "empno,ename,job,mgr,hiredate >= fromHiredate,hiredate <= toHiredate,sal >= fromSal,sal <= toSal,deptno";

public List searchEmployeeDtoList(EmployeeSearchDto dto);

PROPERTYアノテーションが追加になっています。
PROPERTYアノテーションは、基本的にはdtoのプロパティをカンマ区切りで記述していきます。


A)演算子が"="の条件の場合
「empno,ename,job,mgr」と最後の「deptno」の4つに関しては、
それぞれ、s2daoの「/*IF dto.empno != null*/and empno = /*dto.empno*/7788/*END*/」の様にnullでない場合、
「empno = dto.empno」の様なイメージで検索条件に含めます。


B)ひとつのエンティティdtoのプロパティに、2つ以上の検索条件dtoのプロパティをマッピングするの条件の場合
「hiredate >= fromHiredate,hiredate <= toHiredate,sal >= fromSal,sal <= toSal」に関しては、
それぞれ「[エンティティのdtoのプロパティ名] [演算子] [検索条件のdtoのプロパティ名]」の形式で記述して、
これも、検索条件dtoのプロパティの値がnullでない場合、検索条件に含める動きにしようと考えています。


※検索条件に含めた条件は、すべてandでつなげます。


あと、次のような記述も予定しています。


C)ひとつのエンティティdtoのプロパティに、1の検索条件dtoのプロパティをマッピングするの条件の場合
この場合、 B) の[検索条件のdtoのプロパティ名]を省略できます。
「[エンティティのdtoのプロパティ名] [演算子] [検索条件のdtoのプロパティ名(省略可能)]」
次の「ename like」の様な記述の方法をイメージしています。


// public String searchEmployeeDtoList_ARGS = "dto";
public String searchEmployeeDtoList_PROPERTY = "empno,ename like,job,mgr,hiredate >= fromHiredate,hiredate <= toHiredate,sal >= fromSal,sal <= toSal,deptno";

public List searchEmployeeDtoList(EmployeeSearchDto dto);


ちなみに、いまいま版は、CVSにあげてあります。

S2Hibernate1.0.6b2リリース

まだ、ドキュメントが追いついていませんが、
機能追加したままで、リリースできていなかったので、一旦リリースします。


・1.0.6b2リリースノート

追加
 ・EAGERアノテーションの追加 http://d.hatena.ne.jp/kenichi_okazaki/20041120#p3
 ・DistinctIteratorの追加 http://d.hatena.ne.jp/koichik/20040920#1095687899
 ・ReadOnlySessionInterceptorの追加 http://d.hatena.ne.jp/koichik/20050126#1106757621
 ・LOCKアノテーションの追加 (ロックをかけてオブジェクトを取得することができます)
 ・LoadCommandの追加 内部的にはsession.getを呼んでいます。
 ・検索の引き数にListを指定できるようにしました。


修正
 ・Seasar V2.1.12、Hibernate 2.1.8, hsqldb1.7.3にライブラリを更新しました。
 ・InsertCommandのクラス名をSaveCommandに変更
 ・SaveCommand,UpdateCommand,DaleteCommand,saveOrUpdateCommandのflushを削除
 ・saveOrUpdateCommandコマンドが呼ばれないのを修正しました。


ちなみに、DistinctIteratorは、プロジェクトで使っています。助かりました。
ありがとうございます。id:koichikさん!