【问题标题】:How to add multiple filter conditions based on incoming parameters to the Exposed DAO API ".find"如何根据传入参数向 Exposed DAO API“.find”添加多个过滤条件
【发布时间】:2019-01-25 15:57:45
【问题描述】:

我正在使用 kotlin 编写一个 dropwizard 应用程序,其中一种资源方法将接收多个参数(电子邮件、电话、is_deleted 等)。根据传入的查询参数,我必须过滤表。我正在使用 Exposed 的 DAO API 来构造查询。

val result = User.find { //SqlExpressionBuilder Users.isDeleted eq false Users.email eq "so@soso.com" }.sortedByDescending { it.createdAt }

如何使用 for in 循环根据查询参数的映射向查询添加多个 where 条件?

【问题讨论】:

  • 您的意思是“查询参数映射”在您的示例中是isDeletedemail 的状态吗?您希望在循环中拥有多少这样的地图?组合一个很复杂的查询条件不是很有效,因为你的数据库不能使用索引,有时最好用10个简单快速的查询代替。
  • 是的。这些是可通过查询参数搜索的表字段。给定的 sn-p 只是一个示例。搜索查询参数是表中的索引列。最多 6 个参数是我所期望的。但它可以是任何组合,例如 email、is_deleted、email 和 is_deleted、email 和 is_deleted 和 phone、email 和 phone 等。它可以是任何组合。所以我需要根据参数的存在来框定 where 条件。
  • 您可以尝试查看"conditional where" wiki 部分。并编写自己的orWhere 函数类似于andWhere
  • @Tapac,谢谢,我知道使用 DSL 我可以让它工作。我只是想知道,使用DAO我们可以做到吗。
  • 那么唯一的选择是使用:User.wrapRows(query).sortedByDescending() 并在循环内设置query

标签: kotlin kotlin-exposed


【解决方案1】:

我必须使用 DSL 解决问题。似乎 DAO 没有这样的规定来创建这样的临时查询。

val query = Users.selectAll()
for((k, v) in params) {
    val value = URLDecoder.decode(v, "UTF-8")
    when(value) {
        "email" -> query.andWhere { Users.email eq value }
        "phone" -> query.andWhere { Users.phone eq value }
    }
}
return query.andWhere { Users.isDeleted.eq(false) }

正如@Tapac 提到的,人们也可以使用User.wrapRows(query).sortedByDescending() 来构建这样的查询,但同样必须使用 DSL。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2021-12-02
    • 2020-08-16
    相关资源
    最近更新 更多