You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Kotlin Exposed实现带Where条件的selectAll查询功能?

Kotlin Exposed 带条件的分页查询修复方案

问题根源

你的代码存在两个核心问题导致结果始终为空:

  • 查询顺序错误:先执行limit分页再添加where条件,导致仅对分页后的少量数据进行过滤,大概率返回空
  • 分页偏移量计算错误:直接使用page.toLong()作为偏移量,不符合常规分页逻辑(页码从1开始时,偏移量应为(页码-1)*每页数量)

修复后的代码

suspend fun getAll(
    page: Int, size: Int, keyword: String = ""
): List<DTO> = suspendableQuery {
    UserTable.selectAll()
        .where(searchCondition(keyword)) // 先过滤全表数据
        .limit(size, (page - 1) * size.toLong()) // 再对过滤结果分页
        .map(::toDTO)
}

fun searchCondition(keyword: String): SqlExpressionBuilder.() -> Op<Boolean> = {
    if (keyword.isNotBlank()) {
        (UserTable.phone eq keyword) or (UserTable.name eq keyword)
    } else {
        Op.TRUE // 无关键字时返回恒真条件,不对结果做过滤
    }
}

关键修改说明

  1. 调整查询顺序
    先通过where添加过滤条件,再执行limit分页。这样会先筛选出所有符合关键字的数据,再从中截取分页片段,保证结果的准确性。

  2. 修正偏移量计算
    偏移量改为(page - 1) * size.toLong(),确保:

    • 第1页偏移0条数据,取前size条
    • 第2页偏移size条数据,取接下来的size条
      完全符合常规分页逻辑。
  3. 优化关键字判断
    使用isNotBlank()替代isNotEmpty(),可以过滤掉全空格的无效关键字,避免无意义的查询。

可选:实现模糊搜索

如果需要支持包含关键字的模糊匹配(而非精确匹配),可以将条件改为like:

fun searchCondition(keyword: String): SqlExpressionBuilder.() -> Op<Boolean> = {
    if (keyword.isNotBlank()) {
        (UserTable.phone like "%$keyword%") or (UserTable.name like "%$keyword%")
    } else {
        Op.TRUE
    }
}

内容的提问来源于stack exchange,提问作者MohammadBaqer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:21:06