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条件,返回单条记录

如何检查传入的 JSON 提要是不是包含单条记录或多条记录?

获取单条记录的统一模板

从可能产生多条记录的连接表中获取单条记录

使用 SQL 根据单条记录的更改对多条记录进行更改

SQL 查询:如果满足搜索条件,则应返回单条记录,否则返回多条记录