Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

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でやるのは諦めて、ベタで検索条件を組み立てることにしました。このやり方を参考にしました。