如何在Ktor中使用Exposed查询数据库表的最后一条记录?
使用Exposed框架查询数据库表最后一条记录
要获取articles_info表的最后一条记录,核心思路是按主键(通常是自增的id字段)降序排序,然后仅取第一条数据。以下是完整的实现代码及说明:
1. 调整表对象字段可见性(可选)
原代码中表字段为private,映射DTO时需要访问这些字段,建议改为public:
object ArticlesInfo : Table("articles_info") { val id = integer("id").autoIncrement() // 假设id是自增主键,可根据实际情况调整 val likes = integer("likes") val views = integer("views") }
2. 实现查询最后一条记录的函数
修改fetchArticleInfoLastRecord函数,通过排序+限制条数来获取目标记录,并完成DTO映射:
fun fetchArticleInfoLastRecord(): ArticleInfoDTO? { return transaction { ArticlesInfo .selectAll() .orderBy(ArticlesInfo.id to SortOrder.DESC) // 按id降序,最新的记录排在最前 .limit(1) // 只取第一条 .singleOrNull() // 避免表为空时抛出异常,返回null ?.let { result -> ArticleInfoDTO( id = result[ArticlesInfo.id], likes = result[ArticlesInfo.likes], views = result[ArticlesInfo.views] ) } } }
关键说明
- 如果你的表不是用
id作为排序依据(比如有create_time时间字段),只需把orderBy的字段换成对应字段即可,例如:.orderBy(ArticlesInfo.createTime to SortOrder.DESC) - 原函数返回非空的
ArticleInfoDTO,但实际场景下表可能为空,所以改为返回ArticleInfoDTO?更合理。如果业务要求必须返回非空值,可以在singleOrNull()后添加默认值或者抛出业务异常,例如:.singleOrNull() ?: throw IllegalStateException("表中无数据")
内容的提问来源于stack exchange,提问作者hestonic
相关产品推荐
相关产品推荐

