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; } ... }