【问题标题】:Kotlin Exposed SELECT single recordKotlin 暴露 SELECT 单条记录
【发布时间】:2021-03-16 10:30:33
【问题描述】:

有没有办法只选择一条暴露了 kotlin 的记录? 目前我正在使用下面的代码从数据库中选择一个用户,但是有没有像 selectSingle() 这样的函数来获取一个对象(不是列表)?

fun getUser(userId: Int): User? {

    var user: User? = null

    transaction {
        user = UserTable.select { UserTable.id eq userId }.limit(1).map { User.fromRow(it) }[0]
    }

    return user
}

【问题讨论】:

    标签: kotlin ktor kotlin-exposed


    【解决方案1】:

    我找到了一个很好的解决方案。致谢hfazai

    fun getUser(userId: Int): User? {
    
    var user: User? = null
    
    val user = transaction {
       user = UserTable.select { UserTable.id eq userId }.limit(1).single().let { User.fromRow(it) }
    }
    
    return user
    }
    

    PS : 如果没有结果,single() 将抛出 NoSuchElementException,如果有多个结果行,则抛出 IllegalArgumentException。

    你也可以省略用户变量

    fun getUser(userId: Int): User = 
            transaction {
                    UserTable.select { UserTable.id eq userId }.limit(1).single().let { User.fromRow(it) }
            }
    

    【讨论】:

      【解决方案2】:

      除了你已经做的事情之外,别无他法。您可以使用first()firstOrNull 代替[0]

      与 Kotlin 一样,您可以创建自己的扩展程序来简化调用:

      fun Query.selectSingle() = limit(1).firstOrNull()
      

      在通过主键获取对象的特殊情况下,可以使用 DAO 的findById (docs)。 使用 DAO 可以让您获得 wrapRow/wrapRows (usage example) 实现的额外好处,我猜它的工作方式类似于您的代码中的 User.fromRow(it)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2019-12-08
        • 1970-01-01
        • 2017-06-22
        • 2019-05-14
        • 1970-01-01
        相关资源
        最近更新 更多