2

我在 Kotlin 项目中使用 Exposed 库。在我的表声明中,我有一个这样的列:

val updatedDate = datetime("updated_dt").clientDefault { DateTime.now() }

如果我默认替换 clientDefault 函数有什么不同,如下所示:

val updatedDate = datetime("updated_dt").default(DateTime.now())

我看过这两个函数的源代码,但还是不知道。

clientDefault功能:

fun <T:Any> Column<T>.clientDefault(defaultValue: () -> T): Column<T> {
        this.defaultValueFun = defaultValue
        this.dbDefaultValue = null
        return this
    }

default功能:

fun <T:Any> Column<T>.default(defaultValue: T): Column<T> {
        this.dbDefaultValue = SqlExpressionBuilder.run {
            asLiteral(defaultValue)
        }
        this.defaultValueFun = { defaultValue }
        return this
    }
4

1 回答 1

3

通常的区别是(仅通过您引用的代码):

  1. default只接受一个固定的T并且会生成一个DEFAULTSQL 子句;

  2. clientDefault接受一个生成 a 的函数T(因此它可以为不同的行返回不同的结果)并且不生成 a DEFAULT

所以default(DateTime.now())几乎肯定不是你想要的。它会生成类似于DEFAULT "2019-10-10T..."它所调用的日期时间的东西,而不是DEFAULT NOW().

于 2019-10-10T05:12:00.450 回答