Kotlin 暴露 SELECT 单条记录

问题描述 投票:0回答:3

有没有办法只选择一条暴露了 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
3个回答
2
投票

我找到了一个很好的解决方案。学分归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) }
        }

0
投票

除了你已经做的事情之外,别无他法。您可以使用

first()
firstOrNull
代替
[0]

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

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

在特殊情况下,当您通过主键获取对象时,可以使用 DAO 的

findById
(docs)。 使用 DAO 可以为您带来
wrapRow
/
wrapRows
使用示例)实现的额外好处,我猜它的工作原理与代码中的
User.fromRow(it)
类似。


0
投票

您现在可以使用

singleOrNull
来避免没有结果时出现 NoSuchElementException。

fun getUser(userId: Int): User = 
    transaction {
        UserTable.select { 
            UserTable.id eq userId 
        }.limit(1).singleOrNull()?.let { User.fromRow(it) }
    }
© www.soinside.com 2019 - 2024. All rights reserved.