如何在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
相关产品推荐
相关产品推荐

