Version v3.0 of the documentation is no longer actively maintained. The site that you are currently viewing is an archived snapshot. For up-to-date documentation, see the latest version.
はじめに
概要
Komapperではクエリの構築と実行は分離されています。 クエリの構築は Query DSL が担い、 実行はJDBCやR2DBCを表す データベース インスタンスが担います。
// construct a query
val query: Query<List<Address>> = QueryDsl.from(a)
// execute the query
val result: List<Address> = db.runQuery { query }
上述の例ではシングルトンの QueryDSL
を利用していますが、 QueryDSL
はインスタンス化することもできます。
インスタンス化は、同一のインスタンスから生成するクエリ間でクエリのオプションを共有する場合に有用です。
// instantiate a QueryDSL
val myDsl = QueryDsl(selectOptions = SelectOptions(queryTimeoutSeconds = 10))
// share the query options
val query1: Query<List<Address>> = myDsl.from(a)
val query2: Query<List<Employee>> = myDsl.from(e)
前提条件
クエリ の下位ページでは、下記のエンティティ定義、マッピング定義、変数が存在することを前提に説明をします。
data class Address(
val addressId: Int,
val street: String,
val version: Int
)
data class Department(
val departmentId: Int,
val departmentNo: Int,
val departmentName: String,
val location: String,
val version: Int,
)
data class Employee(
val employeeId: Int,
val employeeNo: Int,
val employeeName: String,
val managerId: Int?,
val hiredate: LocalDate,
val salary: BigDecimal,
val departmentId: Int,
val addressId: Int,
val version: Int,
)
@KomapperEntityDef(Address::class)
data class AddressDef(
@KomapperId @KomapperColumn(name = "ADDRESS_ID") val addressId: Nothing,
@KomapperVersion val version: Nothing
)
@KomapperEntityDef(Department::class)
data class DepartmentDef(
@KomapperId @KomapperColumn("DEPARTMENT_ID") val departmentId: Nothing,
@KomapperColumn("DEPARTMENT_NO") val departmentNo: Nothing,
@KomapperColumn("DEPARTMENT_NAME") val departmentName: Nothing,
@KomapperVersion val version: Nothing,
)
@KomapperEntityDef(Employee::class)
data class EmployeeDef(
@KomapperId @KomapperColumn("EMPLOYEE_ID") val employeeId: Nothing,
@KomapperColumn("EMPLOYEE_NO") val employeeNo: Nothing,
@KomapperColumn("EMPLOYEE_NAME") val employeeName: Nothing,
@KomapperColumn("MANAGER_ID") val managerId: Nothing,
@KomapperColumn("DEPARTMENT_ID") val departmentId: Nothing,
@KomapperColumn("ADDRESS_ID") val addressId: Nothing,
@KomapperVersion val version: Nothing,
)
val a = Meta.address
val d = Meta.department
val e = Meta.employee
注意点
クエリの生成例ではどのようなクエリが生成されるかわかりやすくするために型を明示的に記載しますが実際は省略可能です。
val query: Query<List<Address>> = QueryDsl.from(a)
/*
select t0_.ADDRESS_ID, t0_.STREET, t0_.VERSION from ADDRESS as t0_
*/
また、対応するSQLはコメント内に記述しますが、特に断りがなければH2 Database Engine向けのDialectを使った場合に生成されるSQLを示します。 利用するDialectによっては異なるSQLが生成されることがあります。
最終更新 July 13, 2024: Write QueryDSL as a single word (ef0459c)