s2jdbcのSimpleWhereですが、個人的にイマイチだと思っている部分があります。
propertyName = ? の条件を追加します。valueがnullの時は追加されません。
http://s2container.seasar.org/2.4/ja/s2jdbc_manager_auto.html#SimpleWhereによる指定
valueがnullの時は追加されません。
↑この部分です。
public class Test1Service extends AbstractService<Test1> { public List<Test1> find(String cVarchar) { return select().where(new SimpleWhere().eq(Test1Names.CVarchar(), cVarchar)).getResultList(); } }
public void testSelect() { String param = "test"; List<Test1> list = test1Service.find(param); for (Test1 test1 : list) { System.out.println(test1.CVarchar); } }
↑ここで、findの引数にnullを渡すと、nullの条件句をwhere句から削除してくれます。
select * from test1 where c_varchar = ?; ↓こうなる select * from test1;
対象の条件句が削除されるわけですが、バグでvalueにnullが渡された場合、最悪全件selectされます。
バグが起きるシステムが悪い、って話ですが、大規模案件でこんな危険な橋を渡る訳にはいきません。
joinを沢山していて全件selectされようものなら、tomcatがOutOfMemoryするし、MySQLのinnodb_buffer_poolも使い切られてしまいます。
そこで、valueにnullが渡された場合に例外をスローする動作になるようにカスタマイズをしてみます。
org.seasar.extension.jdbc.where.AbstractWhere の一部をoverrideします。
public class SimpleWhereEx extends org.seasar.extension.jdbc.where.SimpleWhere { @Override protected Object normalize(final Object value) { if (value == null) { throw new BadRequestException("パラメータがnullです"); } return value; } }
public class Test1Service extends AbstractService<Test1> { public List<Test1> find(String cVarchar) { return select().where(new SimpleWhereEx().eq(Test1Names.CVarchar(), cVarchar)).getResultList(); } }
こんな感じで、normalizeメソッドをoverrideし、例外をスローします。
normalizeは配列・リスト・コレクション用もあるので、それらもカスタマイズしましょう。
例外を投げる理由は、valueにnullを渡さない運用なのだから、nullが渡された時点でバグと判断するためです。
- 作者: ひがやすを
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2009/02/11
- メディア: 大型本
- 購入: 26人 クリック: 267回
- この商品を含むブログ (33件) を見る