【问题标题】:Kotlin exposed DSL Query mappingKotlin 暴露了 DSL 查询映射
【发布时间】:2018-05-14 21:06:52
【问题描述】:
  • 如何将选择查询映射到类
  • 是否有任何@transactional 注释来执行查询?

    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
    }
    

【问题讨论】:

标签: sql kotlin kotlin-exposed


【解决方案1】:

我知道已经晚了,但对于其他有这个问题的人: 如果您使用 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) }
    }

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这对我不起作用。它说“类型推断失败。预期类型不匹配:必需:找到列表:列表
    • 没关系。我在做Users.all() 而不是User.all()
    【解决方案3】:

    我将值提取到 HashMap 中的解决方案,以 pk 作为值

        fun getRaw(): List<HashMap<String, Any?>> {
            return transaction {
                val list = Users.selectAll().toList()
    
                list.map { data ->
                    HashMap<String, Any?>().also { map ->
                        Users.columns.forEach {
                            if (data[it] is EntityID<*>) {
                                map[it.name] = (data[it] as EntityID<*>).value
                            } else {
                                map[it.name] = data[it]
                            }
                        }
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-08
      • 2016-09-25
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多