S2JDBCでhstore用のwhereクラスを作る
S2JDBCでPostgreSQLのhstoreを使う - より良い環境を求めて の続き。
S2JDBCのwhereメソッドに指定するクラスは、Whereクラスを継承して作れる。
abstract class PgsqlOperator<PARAM_TYPE> implements Where { protected final CharSequence propertyName; protected final PARAM_TYPE param; public PgsqlOperator(CharSequence propertyName, PARAM_TYPE param) { this.propertyName = propertyName; this.param = param; } @Override public Object[] getParams() { return new Object[] { param }; } @Override public String[] getPropertyNames() { return new String[] { propertyName.toString() }; } }
単純にプロパティとパラメーターを取るクラスをまず作って
public class ExistFunction extends PgsqlOperator<String> { public ExistFunction(CharSequence propertyName, String param) { super(propertyName, param); } @Override public String getCriteria() { return "exist(" + propertyName + ", ?)"; } }
こんな感じで書く。
包含の演算子の場合は
public class CompriseOperator extends PgsqlOperator<HStore> { public CompriseOperator(CharSequence propertyName, HStore param) { super(propertyName, param); } @Override public String getCriteria() { return propertyName + "@> ?"; } }
こんな感じ。
それからユーティリティクラスを作る。
public class PgsqlOperations { public static <PropType> Where exist(PropertyName<PropType> propertyName, String param) { return new ExistFunction(propertyName, param); } public static Where comprise(PropertyName<HStore> propertyName, HStore param) { return new CompriseOperator(propertyName, param); } ....
使うときは
FooEntity foo1 = select() .where(exist(foo(), "foo")) .getSingleResult(); FooEntity foo2 = select() .where(comprise(foo(), new HStore("\"foo\"=>\"va\""))) .getSingleResult();
こんな感じ。