doma-spring-boot-starter
の1.4.0
で簡単にCriteria APIが使えるようになったので早速つかってみました。
build.gradle
build.gradle
に必要なライブラリを追加します。
doma
の2.30.0
からcore
とprocessor
が分離されてたのも把握できてよかったです。
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のドキュメントにどおりに、
@Entity
にmetamodel
を設定します
@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
をコンストラクタインジェクションでうけとりますEntityql
はdoma-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> }