【问题标题】:Return empty expression in Exposed DAO?在 Exposed DAO 中返回空表达式?
【发布时间】:2020-11-08 20:09:20
【问题描述】:

我正在尝试使用Exposed's DAO API 有条件地将一部分添加到我的 SQL 查询中。我的目标是:

SELECT * FROM table
  WHERE column1 = 1
  AND column2 = $value
  AND column3 = 3

AND column2 = $value 部分的存在取决于过滤器。

我试过了:

TableDAO.find {
    Table.column1 eq 1 and (
        when (filter.value) {
            null -> null // Type mismatch. Required: Expression<Boolean>. Found: Op<Boolean>?
            else -> Table.column2 eq filter.value
        }) and (
            Table.column3 = 3
        )
}.map { it.toModel() }

但我找不到返回空表达式或以某种方式从查询中排除该部分的方法。我能做的唯一解决方案是

null -> Table.column2 neq -1

但我觉得应该有更好的方法。

【问题讨论】:

    标签: kotlin kotlin-exposed


    【解决方案1】:

    您必须将表达式分配给局部变量:

    var expr = Table.column1 eq 1 
    if(filter.value) {
        expr = expr and (Table.column2 eq filter.value)
    }
    expr = expr and (
        Table.column3 = 3
    )
    

    我面前没有我的 IDE,但这是一般的想法。您可以尝试找出一些聪明的方法,但这会使您的代码变得不必要地复杂。

    【讨论】:

    • 好的,谢谢。希望有一种更“内联”的方式来做这件事。
    • 如果您愿意,可以使用let 范围函数,但这将大致转换为相同数量的代码并且更难阅读。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2017-10-27
    • 2012-06-04
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多