如何基于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 // 无关键字时返回恒真条件,不对结果做过滤 } }
关键修改说明
调整查询顺序
先通过where添加过滤条件,再执行limit分页。这样会先筛选出所有符合关键字的数据,再从中截取分页片段,保证结果的准确性。修正偏移量计算
偏移量改为(page - 1) * size.toLong(),确保:- 第1页偏移0条数据,取前
size条 - 第2页偏移
size条数据,取接下来的size条
完全符合常规分页逻辑。
- 第1页偏移0条数据,取前
优化关键字判断
使用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
相关产品推荐
相关产品推荐

