gpt4 book ai didi

kotlin - 不能在 Kotlin/Java 中使用 jooq DSL 做 where 子句

转载 作者:行者123 更新时间:2023-12-04 14:46:55 25 4
gpt4 key购买 nike

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

最佳答案

不使用代码生成器:

我假设您有充分的理由不使用 code generator对于此特定查询,主要原因通常是您的架构是动态的。

因此,编写查询的正确方法是:

create.select()
.from(DSL.table(tableName))

// Attach a DataType to your timestamp field, to let jOOQ know about this
.where(DSL.field("timestamp", SQLDataType.OFFSETDATETIME)

// Use bind values of a temporal type
.between(OffsetDateTime.parse("1970-01-01T00:00:00Z"))
.and(OffsetDateTime.parse("2021-11-05T00:00:00Z")))
.orderBy(DSL.field("id").desc())

请注意我是如何使用实际时间数据类型而不是字符串来比较日期和声明字段的。

根据您问题的 UTC 时间戳,我假设您使用的是 TIMESTAMPTZ。否则,如果您使用的是 TIMESTAMP,只需将 OffsetDateTime 替换为 LocalDateTime...

使用代码生成器

如果使用代码生成器(如果您的架构不是动态的,始终推荐使用代码生成器),您将编写与上面几乎相同的内容,但类型安全:

create.select()
.from(MY_TABLE)

// Attach a DataType to your timestamp field, to let jOOQ know about this
.where(MY_TABLE.TIMESTAMP

// Use bind values of a temporal type
.between(OffsetDateTime.parse("1970-01-01T00:00:00Z"))
.and(OffsetDateTime.parse("2021-11-05T00:00:00Z")))
.orderBy(MY_TABLE.ID.desc())

关于kotlin - 不能在 Kotlin/Java 中使用 jooq DSL 做 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69857954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com