Doma 1.23.0 でSQLの式コメントでカスタム関数が利用可能


こんな感じで、SQLのコメント中で独自に定義した関数(ここではcapitalize)を呼び出せるようになりました。
関数から返される値がPreparedStatementにバインドされます。

select * from employee where employee_name = /* @capitalize(employeeName) */'hoge'

定義


capitalizeの定義はJavaインスタンスメソッドで行います。
次のようにRDBごとのXxxExpressionFunctionsを継承して作成します。

package example;
import org.seasar.doma.jdbc.dialect.H2Dialect.H2ExpressionFunctions;

public class MyH2ExpressionFunctions extends H2ExpressionFunctions {

    public String capitalize(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }
        char chars[] = text.toCharArray();
        chars[0] = Character.toUpperCase(chars[0]);
        return new String(chars);
    }
}


capitalizeを呼び出せるようにするには、コンパイル時とランタイム時の両方の設定が必要です。

コンパイル時の設定


Annotation Processorのオプションにカスタム関数の定義を持つクラスを登録します(キーはexpr.functions、値はカスタム関数の定義を持つクラスの完全修飾名)。
この設定により、カスタム関数の存在チェック、パラメータの型チェック、パラメータの数のチェックがコンパイル時に行われるようになります。
Eclipseのプロジェクトのプロパティから設定します(もちろんAntやMavenでも設定できます)。画像をつけときます。

ランタイム時の設定


Dialectにカスタム関数の定義を持つクラスを登録して、そのDialectを設定クラスで返すようにします。

public class MyConfig extends DomaAbstractConfig {

    private static final Dialect dialect = new H2Dialect(new MyH2ExpressionFunctions());

    @Override
    public Dialect getDialect() {
        return dialect;
    }
    ...
}

まとめ


Doma 1.23.0 からSQLの式コメントでカスタム関数が使えるようになりました。
カスタム関数を使うことでコードの柔軟性が高まりますが、コンパイル時のチェック(存在チェック、型チェックなど)はちゃんと行われるので、バグの混入は発生しにくいです。
カスタム関数は型や値のちょっとした変換に使うと便利だと思います。
ぜひお使いください。