Kotlin 暴露 SELECT 单条记录
Posted
技术标签:
【中文标题】Kotlin 暴露 SELECT 单条记录【英文标题】:Kotlin Exposed SELECT single record 【发布时间】: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
【问题讨论】:
【参考方案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)
。
【讨论】:
以上是关于Kotlin 暴露 SELECT 单条记录的主要内容,如果未能解决你的问题,请参考以下文章
如果是单条记录,不适用where条件;如果是多条记录,应用where条件,返回单条记录