Kotlin support
Doma supports Kotlin 1.4.0 or later.
Best practices
Here are some recommended approaches for defining classes and working with Kotlin in Doma.
Entity classes
Define as a plain class
Specify a
Metamodel
annotation in themetamodel
element of@Entity
@Entity(metamodel = Metamodel())
class Person : AbstractPerson() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = -1
var name: Name? = null
var age: Int? = -1
var address: Address? = null
@Column(name = "DEPARTMENT_ID")
var departmentId: Int = -1
@Version
var version: Int = -1
}
Domain classes
Define as a data class
Define only one constructor
Define only one property named
value
in the constructorUse val for the property definition
@Domain(valueType = String::class)
data class Name(val value: String)
Embeddable classes
Define as a data class
Define only one constructor
Define properties only in the constructor
Use val for the property definitions
@Embeddable
data class Address(val city: String, val street: String)
Dao interfaces
Specify a SQL template with
@org.seasar.doma.Sql
@Dao
interface PersonDao {
@Sql("""
select * from person where id = /*id*/0
""")
@Select
fun selectById(id: Int): Person
@Insert
fun insert(person: Person): Int
}
val dao: PersonDao = ...
val person = Person(name = Name("John"), address = Address(city = "Tokyo", street = "Yaesu"))
val count = dao.insert(person)
Kotlin-specific Criteria API
Note
It is recommended to use the Kotlin-specific Criteria API rather than DAO interfaces.
Doma provides KQueryDsl
, a Criteria API specifically designed for Kotlin.
It is very similar to the QueryDsl
, which is described in Unified Criteria API.
The main advantage of KQueryDsl
is its simplicity.
val queryDsl = KQueryDsl(config)
val e = Employee_()
val list = queryDsl
.from(e)
.where {
eq(e.departmentId, 2)
isNotNull(e.managerId)
or {
gt(e.salary, Salary("1000"))
lt(e.salary, Salary("2000"))
}
}
.fetch()
You can find more sample code here.
The KQueryDsl
is included in the doma-kotlin module.
Note that you should use doma-kotlin instead of doma-core in your build script.
You can configure your build.gradle.kts as follows:
dependencies {
implementation("org.seasar.doma:doma-kotlin:3.10.0")
}
Code Generation
Use Doma CodeGen Plugin. This plugin supports Kotlin code generation.
Using kapt in Gradle
Annotation processors are supported in Kotlin with the kapt compiler plugin.
Add the dependencies using the kapt and implementation configurations in your dependencies block. For example, you can write build.gradle.kts as follows:
dependencies {
kapt("org.seasar.doma:doma-processor:3.10.0")
implementation("org.seasar.doma:doma-kotlin:3.10.0")
}
To simplify your build script, we recommend using the Doma Compile Plugin.