Kotlin サポート

Doma は、 Kotlin 1.4.0 以降をサポートしています。

ベストプラクティス

Kotlinでクラスを定義してビルドするなど、おすすめの方法を紹介します。

エンティティクラス

  • プレーンクラスとして定義する

  • @Entitymetamodel 要素に Metamodel アノテーションを指定する

@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
}

ドメインクラス

  • データクラスとして定義する

  • コンストラクターを 1 つだけ定義する

  • コンストラクターでは、名前が value であるプロパティを 1 つだけ定義する

  • プロパティ定義には val を使用する

@Domain(valueType = String::class)
data class Name(val value: String)

埋め込み可能クラス

  • データクラスとして定義する

  • コンストラクターを 1 つだけ定義する

  • コンストラクター内でのみプロパティを定義する

  • プロパティ定義には val を使用する

@Embeddable
data class Address(val city: String, val street: String)

Dao インターフェース

  • SQLテンプレートを @org.seasar.doma.Sql に指定する

  • @Delete@Insert、および @Update の戻り値の型として org.seasar.doma.jdbc.Result を使用する

  • @BatchDelete@BatchInsert@BatchUpdate の戻り値の型として org.seasar.doma.jdbc.BatchResult を使用する

@Dao
interface PersonDao {
  @Sql("""
  select * from person where id = /*id*/0
  """)
  @Select
  fun selectById(id: Int): Person

  @Insert
  fun insert(person: Person): Result<Person>
}
val dao: PersonDao = ...
val person = Person(name = Name("John"), address = Address(city = "Tokyo", street = "Yaesu"))
val (newPerson, count) = dao.insert(person)

Kotlin 固有の Criteria API

注釈

DAO インターフェイスよりも Kotlin 固有の Criteria API を使ってください

Doma は、Kotlin 固有の Criteria API、KEntityql および KNativeSql DSL を提供します。これらは、Criteria API で説明されている Entityql および NativeSql DSL と非常に似ています。 KEntityqlKNativeSql DSL の最大の特徴はそのシンプルさです。

たとえば、 Entityql を使用する場合は、次のように WHERE 式でラムダパラメータを受け入れる必要があります。

val entityql = Entityql(config)
val e = Employee_()

val list = entityql
    .from(e)
    .where { c ->
        c.eq(e.departmentId, 2)
        c.isNotNull(e.managerId)
        c.or {
            c.gt(e.salary, Salary("1000"))
            c.lt(e.salary, Salary("2000"))
        }
    }
    .fetch()

ラムダパラメータ「c」は少し面倒です。一方、 KEntityql を使用すると、パラメータはなくなります。

val entityql = KEntityql(config)
val e = Employee_()

val list = entityql
    .from(e)
    .where {
        eq(e.departmentId, 2)
        isNotNull(e.managerId)
        or {
            gt(e.salary, Salary("1000"))
            lt(e.salary, Salary("2000"))
        }
    }
    .fetch()

ここ <https://github.com/domaframework/doma-it/tree/master/kotlin/src/test/kotlin/org/seasar/doma/it/criteria>`_ で多くのサンプル コードを参照できます。

KEntityql および KNativeSql DSL は doma-kotlin.jar に含まれています。ビルド スクリプトでは doma-core ではなく doma-kotlin に依存する必要があることに注意してください。 build.gradle.kts は次のように記述できます。

dependencies {
    implementation("org.seasar.doma:doma-kotlin:2.56.0")
}

コード生成

Doma CodeGen プラグイン を使用してください。このプラグインは Kotlin コード生成をサポートします。

Gradle での kapt の使用

アノテーション プロセッサは、Kotlin で kapt コンパイラ プラグインを使用してサポートされています。

依存関係ブロックの kapt および implementation を使用して依存関係を追加します。たとえば、次のように build.gradle.kts を記述できます。

dependencies {
    kapt("org.seasar.doma:doma-processor:2.56.0")
    implementation("org.seasar.doma:doma-kotlin:2.56.0")
}

ビルド スクリプトを簡略化するには、Doma コンパイル プラグイン を使用することをお勧めします。

サンプルプロジェクト