Open1

DomaでSQLテンプレートの部品化をサポート(検討中)

nakamura_tonakamura_to

基本方針は、Komapperで実現した方法を踏襲。
https://v5-1.komapper.org/ja/docs/reference/query/querydsl/command/#command-partial

部品はこう定義する。SQLファイルはサポートせず、アノテーションのみをサポート予定。アノテーションプロセッサでバインド変数の間違いなどをチェックする。

@SqlPartial("limit /* limit */0 offset /* offset */0") 
record Pagination(int limit, int offset) {}

部品を利用するDAO。

@Dao
interface EmployeeDao {
  @Sql(
  """
  select
    * from employee e
  where
    e.departmentId = /* departmentId */0
  order by
    e.employeeId
  /*> pagination */ 
  """)
  @Select
  List<Employee> selectByDepartmentId(Integer departmentId, Pagination pagination)
}

DAOを呼び出すコード。

EmployeeDao dao = ...;
List<Employee> list = dao.selectByDepartmentId(1, new Pagination(0, 100));

実行されるSQL。

  select
    * from employee e
  where
    e.departmentId = ?
  order by
    e.employeeId
  limit ? offset ?

実行時に最終的なSQLに変換させるためにSQLを2回パース(1回目で部品部分を展開して、2回目で通常の処理)しないといけないのがパフォーマンス的に少し懸念。