【问题标题】: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)。