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