在暴露的DAO中返回空表达式?

问题描述

我正在尝试使用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

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

解决方法

您必须将表达式分配到局部变量中

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

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