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

如何在Exposed中基于queryParameters动态设置WHERE子句?

动态构建Exposed查询条件(仅应用存在的Query参数)

修改后的PurchasesDAO实现

override suspend fun allPurchases(params: Map<String, List<String>>): List<Purchase> = DatabaseFactory.dbQuery {
    // 初始化基础条件:无过滤时匹配所有数据
    var condition: Op<Boolean> = Op.TRUE

    // 处理id参数:存在则添加inList过滤
    params["id"]?.takeIf { it.isNotEmpty() }?.let { idStrings ->
        val ids = idStrings.map { it.toInt() }
        condition = condition and (Purchases.id inList ids)
    }

    // 处理location参数
    params["location"]?.takeIf { it.isNotEmpty() }?.let { locations ->
        condition = condition and (Purchases.location inList locations)
    }

    // 处理dates参数(根据实际日期格式调整转换逻辑)
    params["dates"]?.takeIf { it.isNotEmpty() }?.let { dateStrings ->
        val dates = dateStrings.map { LocalDate.parse(it) }
        condition = condition and (Purchases.dates inList dates)
    }

    // 可继续添加其他参数的处理逻辑...

    // 使用动态构建的条件执行查询
    Purchases.select(condition).map(::resultRowToPurchase)
}

核心逻辑说明

  • 用Op.TRUE作为初始条件,确保无查询参数时返回全量数据。
  • 对每个参数通过?.takeIf { it.isNotEmpty() }?.let做安全校验:仅当参数存在且不为空列表时,才生成对应的inList过滤条件。
  • 每次新增条件时,用and与已有条件合并,实现多参数的联合过滤。
  • 类型转换(如id转Int、日期字符串转LocalDate)需与你的Exposed表字段定义匹配,按需调整。

路由层保持不变

你的Routes.kt代码无需修改,已经正确将Query参数传递到DAO层。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:45:38