文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

s2jdbcのSimpleWhereをカスタマイズする

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するし、MySQLinnodb_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が渡された時点でバグと判断するためです。

Seasar2入門

Seasar2入門