Kotlin サポート

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

ベストプラクティス

Kotlinでクラスを定義し、Domaで使用するためのおすすめのアプローチをいくつか紹介します。

エンティティクラス

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

  • @Entitymetamodel 要素に Metamodel annotation を指定する

@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 で指定する

@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 = new PersonDaoImpl(config)
val person = Person(name = Name("John"), address = Address(city = "Tokyo", street = "Yaesu"))
val count = dao.insert(person)

Kotlin 固有の Criteria API

注釈

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

Doma はKotlin 専用の Criteria APIである KQueryDsl を提供します。これは クエリDSL で説明されている QueryDsl にとても似ています。KQueryDsl の最大の特徴はシンプルさです。

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()

ここ で多くのサンプル コードを参照できます。

KQueryDsl はdoma-kotlinモジュールに含まれています。ビルドスクリプトでは doma-core の代わりに doma-kotlin を使用してください。build.gradle.kts は次のように構成できます:

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

コード生成

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

Gradle での kapt の使用

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

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

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

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

サンプルプロジェクト

  • kotlin-sample で多くのサンプル コードを参照できます。