[Seasar-user:12658] Re: [SAStruts + S2JDBC]

Yasuo Higa [E-MAIL ADDRESS DELETED]
2008年 1月 28日 (月) 18:16:33 JST


ひがです。

> 出羽です、お疲れ様です。
> 
> SAStruts + S2JDBCで以下のような日付範囲検索
> プログラムを実装してみました。
> 
> 
> /** 検索条件: 従業員名の前方一致 */
> public String condition_name_STARTS;
> 
> /** 検索条件:入社日の範囲検索(開始) */
> @DateType
> public String condition_hireDate_GE;
> 
> /** 検索条件:入社日の範囲検索(終了) */
> @DateType
> public String condition_hireDate_LE;
> 
> @Execute(validator = false)
> public String list() {
>     empItems = jdbcManager.from(Emp.class)
>         .leftOuterJoin("dept")
>         .where(Beans.createAndCopy(BeanMap.class, this)		
	
>             .prefix("condition_")
>             .dateConverter("yyyyMMdd", "hireDate")
>             .execute())
>         .orderBy("hireDate")
>         .getResultList();
>     return "list.jsp";
> }
> 
> 
> 以下は、condition_name_STARTS プロパティ、及び、
> condition_hireDate_LEプロパティに空文字が
> セットされた場合に 生成されるSQLです。
> 
> 
> select 
> 	T1_.ID, T1_.NAME, T1_.HIRE_DATE, 
> 	T1_.DEPT_ID, T1_.VERSION_NO, 
> 	T2_.ID, T2_.NAME, T2_.VERSION_NO 
> from 
> 	EMP T1_ left outer join DEPT T2_ on T1_.DEPT_ID = T2_.ID 
> where 
> 	T1_.HIRE_DATE >= '1982-01-01' 
> 	and T1_.NAME like '%' 
> 	and T1_.HIRE_DATE <= null 
> order by 
> 	T1_.HIRE_DATE
> 
> 『and T1_.HIRE_DATE <= null』の条件は
> 生成しなくても良いと思ったのですがいかがでしょうか?
> (検索結果が0件になってしまいます。)
> 
BeanMapにコピーされた段階では空文字なので、
whereに渡されたときには、nullではないと判断され、
条件に足されます。

その後、Conversion系の修正により、空文字は、nullに
変換されるようになったので、T1_.HIRE_DATE <= ""
がT1_.HIRE_DATE <= nullに変換されて実行されます。

これを防ぐためには、S2BeanUtilsの呼び出しで、
excludesWhitespace()を指定してください。

T1_.NAME like '%'についても、これで対応できるはずです。

よろしくお願いします。


Seasar-user メーリングリストの案内