S2JDBCのSimpleWhereにDB関数を入れたい
4つパラメーターがあってですね、3つは全部SimpleWhereでカバーできるのです。最後の4個目が納期なんですが、その納期を月別に検索したいとおっしゃるのですね。OH、これ関数使わないといけないじゃん。
mysqlの場合MONTH(date)ってやると、その月がゲットできる。MONTH(date)=4でdateが4月のものをゲットできる。
最初はとりあえずこうやった。
jdbcManager. from(Hoge.class). where(new SimpleWhere() .eq("a", a).excludesWhitespace() .eq("b",b).excludesWhitespace() .starts("c", c).excludesWhitespace()) .where("MONTH(DATE)=>",date)//ここ重要 .limit(limit).offset(offset).getResultList();
where(new SimpleWhere()).where("MONTH..")って感じでむりやりくっつけた。そしたらしっかり怒られた。
java.lang.NullPointerException: value org.seasar.extension.jdbc.query.AbstractQuery.addParam(AbstractQuery.java:314) org.seasar.extension.jdbc.query.AutoSelectImpl.prepareWhere(AutoSelectImpl.java:955) org.seasar.extension.jdbc.query.AutoSelectImpl.prepare(AutoSelectImpl.java:355) org.seasar.extension.jdbc.query.AbstractSelect.getResultList(AbstractSelect.java:169)
WhereにWhereを重ねると、WhereインスタンスのそのものがNULLになるっぽく、ガッされてしまう。可能な限り楽がしたいので、SimpleWhereでWhereの第1引数のようなSQL関数入り検索条件を投げてみたい。以下夢の機能。
where(new SimpleWhere() .eq("a", a).excludesWhitespace() .eq("b",b).excludesWhitespace() .starts("c", c).excludesWhitespace().query("MONTH(DATE=?",date)
多分無理だと思う。でも、一応かいてみるw
良く見たらgetCriteria()というメソッドがあり、これはSQLの検索条件を文字列で返してくれるものだった。検索条件がNULLや空文字の場合は無視される。それに文字列で検索条件を付与して、Whereの中に入れて使ってねっていうのがきっと推奨なんだろうなぁ。
Operationsのand()やComplexWhereはWhereインターフェイスを実装したクラスしか入れられない=SimpleWhereかComplexWhereだから、動的に好きな条件を登録できなかった。addConditionってメソッドがあったけどvoidになってるから流れるようなインターフェイスには適用できない。あれが外から叩けたらなぁ。
いじょう。
追記(2010/03/18)
APIでやるのは諦めて、ベタで検索条件を組み立てることにしました。このやり方を参考にしました。