しおしお

IntelliJ IDEAのことなんかを書いてます

Spring BootでDomaのCriteria APIをつかってみる

doma-spring-boot-starter1.4.0で簡単にCriteria APIが使えるようになったので早速つかってみました。

build.gradle

build.gradleに必要なライブラリを追加します。 doma2.30.0からcoreprocessorが分離されてたのも把握できてよかったです。

    implementation("org.seasar.doma.boot:doma-spring-boot-starter:1.4.0")
    implementation("org.seasar.doma:doma-core:2.35.0")
    kapt("org.seasar.doma:doma-processor:2.35.0")

Entity

  • Criteria APIのドキュメントにどおりに、@Entitymetamodelを設定します
@Entity(immutable = true, metamodel = Metamodel())
@Table(name = "user")
data class UserEntity(

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Int,

        val name: String
)

Criteria APIを使ってみる

  • Criteria APIに必要なEntityqlをコンストラクタインジェクションでうけとります
    • Entityqldoma-spring-boot-starterがBean生成してくれるので特に設定せずに簡単に使えます
  • Entityqlには、Entityから生成したmetamodel classを渡します
    • Entityの例に登場したmetamodel = Metamodel()があることで、metamodel class(クラス名の最後にアンダースコアがついたもの)がコンパイル時に生成されます
  • 今回は、Entityのクラス名からmetamodel classを雑にひっぱってきて利用しています
  • あとは、ドキュメントどおりにCriteria APIを使っていくだけですね
import org.seasar.doma.jdbc.criteria.Entityql
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel
import siosio.demo.domain.User
import siosio.demo.domain.UserRepository

class DomaUserRepository(private val entityql: Entityql) : UserRepository {
    override fun findAll(): List<User> {
        return entityql.from(entityType<UserEntity>())
                .fetch()
                .map { User(it.id, it.name) }
    }

    override fun addUser(user: User) {
        entityql.insert(entityType<UserEntity>(), UserEntity(-1, user.name))
                .execute()
    }
}
private inline fun <reified ENTITY> entityType(): EntityMetamodel<ENTITY> {
    return Class.forName("${ENTITY::class.qualifiedName}_").getConstructor()
            .newInstance() as EntityMetamodel<ENTITY>
}

サンプルコード

github.com