【发布时间】:2021-12-19 18:52:53
【问题描述】:
我正在尝试在 Kotlin 中使用 jooq 运行以下表单的查询:
val create = DSL.using(SQLDialect.POSTGRES)
val query: Query = create.select().from(DSL.table(tableName))
.where(DSL.field("timestamp").between("1970-01-01T00:00:00Z").and("2021-11-05T00:00:00Z"))
.orderBy(DSL.field("id").desc())
上面的代码给了我:
syntax error at or near \"and\
此外,在调试器中查看此查询,query.sql 呈现为:
select * from data_table where timestamp between ? and ? order by id desc
我不确定? 是否表示它无法将值呈现给 SQL,或者它们是某种占位符..
此外,代码在没有where 链的情况下也可以工作。
此外,在 Postgres 命令行上,我可以运行以下命令并执行查询:
select * from data_table where timestamp between '1970-01-01T00:00:00Z' and '2021-11-05T00:00:00Z' order by id
查询架构上的数据类型,timestamp 列类型呈现为timestamp without time zone。
在我将变量声明为之前:
val lowFilter = "1970-01-01T00:00:00Z"
val highFilter = "2021-11-05T00:00:00Z"
这不起作用,似乎传递原始字符串也不起作用。我对此很陌生,所以我很确定我在这里弄乱了用法。
编辑 按照@nulldroid 的建议,做了类似的事情:
.where(DSL.field("starttime").between(DSL.timestamp("1970-01-01T00:00:00Z")).and(DSL.timestamp("2021-11-05T00:00:00Z")))
这导致:
Type class org.jooq.impl.Val is not supported in dialect POSTGRES"
【问题讨论】:
-
只是一个疯狂的猜测,但可能是数据类型问题? jooq.org/doc/latest/manual/sql-building/column-expressions/…除此之外,还有什么特别的原因,你为什么要使用 DSL.field("xyz")?使用 Kotlin 时,可以按原样导入数据类,使用 jooq 大写语法访问字段。
-
@nulldroid 所以,我尝试将这些转换为
DSL.timestamp并得到错误"Not supported by dialect : Type class org.jooq.impl.Val is not supported in dialect POSTGRES" -
抱歉含糊不清,我也真的不在置信空间中。你的数据类叫什么?假设它被称为“交易”,我相信您会导入它并执行以下操作:Transaction.TIMESTAMP.between...blog.jooq.org/…
-
@dulldroid 我感谢任何讨论!这对我来说是个问题。我想即时构建它,因此
where过滤器列由用户动态选择。我会暂时尝试一些硬编码值,看看我是否可以让它工作...... -
你使用什么版本的
jooq?无法重现 - 此代码 works fine 在我的机器上使用org.jooq:jooq:3.15.4