Kotlin公开了DSL Query Mapping

时间:2018-05-14 21:06:53

标签: sql kotlin kotlin-exposed

  • 如何将选择查询映射到类
  • 是否有@transactional anotation来执行查询?

    object UserRepository {
    fun getAll() : List<User> {
       return User.selectAll().map { User } // how to add it in a transaction ? // Is it the right way to map query to a Class ?
    }
    
    fun get(id: Int) : User? {
        return User.select { User.id eq id id}.map { User.it } // Mapping Not working
    }
    

2 个答案:

答案 0 :(得分:1)

映射应该自动完成。请参阅文档:

Documentation on DAO

Documentation on DSL

Documentation on transactions

表:

object Users : IntIdTable() {
  val name = varchar("name", 50)
}

实体:

class User(id: EntityID<Int>) : IntEntity(id) {
  companion object : IntEntityClass<User>(Users)

  var name     by Users.name
}

用法:

fun getAllUsers(): List<User> {
  Database.connect(/* ... */)
  return transaction {
    User.all().toList()
  }
}

答案 1 :(得分:0)

我知道已经晚了,但对于其他有此问题的人: 如果使用的是DSL,则可以在数据类中创建一个函数以进行映射。例如:

data class User(
    val id: Int,
    val username: String,
    val password: String
) {

    companion object {

        fun fromRow(resultRow: ResultRow) = User(
            id = resultRow[UserTable.id].value,
            username= resultRow[UserTable.username],
            password = resultRow[UserTable.password]
        )
    }
}

并在您的交易区块中:

transaction {
        user = UserTable.select { UserTable.id eq userId }.map { User.fromRow(it) }
    }