ログ日記

作業ログと日記とメモ

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();

こんな感じ。