簡體   English   中英

錯誤綁定 OffsetDateTime [運算符不存在:時間戳與時區 <= 字符變化]

[英]Error binding OffsetDateTime [operator does not exist: timestamp with time zone <= character varying]

我們正在嘗試執行基於 ZonedDateTime 刪除記錄的 dml。 我們正在使用以下代碼但遇到錯誤。

dsl.execute ("delete from fieldhistory where createddate <= ? and object = ?", beforeDate.toOffsetDateTime(), objName)

其中beforeDate是ZonedDateTime和objectName是字符串

我們從 postgres 收到以下錯誤。

org.jooq.exception.DataAccessException: SQL [delete from fieldhistory where createddate <= ? and object = ?]; ERROR: operator does not exist: timestamp with time zone <= character varying
  Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
  Position: 56
    at org.jooq_3.13.1.POSTGRES.debug(Unknown Source)
    at org.jooq.impl.Tools.translate(Tools.java:2751)
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:755)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:385)
    at org.jooq.impl.DefaultDSLContext.execute(DefaultDSLContext.java:1144)

問題是,我們如何在 Jooq 中綁定日期時間值?

由於歷史原因,jOOQ 將所有 JSR-310 次綁定為字符串,而不是相關的對象類型。 這是因為直到最近,JDBC 驅動程序本身都不支持 JSR-310 類型,因此,使用字符串並不是一個糟糕的默認設置。

不幸的是,這會導致類型歧義,如果出現以下情況,您將不會有這種歧義:

  • jOOQ 沒有綁定字符串
  • 您使用的是代碼生成器,因此鍵入了安全的 DSL API 方法

作為解決方法,您可以執行以下操作,包括:

顯式轉換綁定變量

dsl.execute("delete from fieldhistory where createddate <= ?::timestamptz and object = ?",  
    beforeDate.toOffsetDateTime(), 
    objName)

使用 DSL API

dsl.deleteFrom(FIELDHISTORY)
   .where(FIELDHISTORY.CREATEDDATE.lt(beforeDate.toOffsetDateTime()))
   .and(FIELDHISTORY.OBJECT.eq(objName))
   .execute();

通過編寫自己的綁定

您可以編寫自己的數據類型綁定並將其附加到生成的代碼或普通 SQL 查詢中,在這種情況下,您可以控制如何將綁定變量發送到 JDBC 驅動程序。 請參閱: https : //www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings/

例如:

DataType<OffsetDateTime> myType = SQLDataType.OFFSETDATETIME
                                             .asConvertedDataType(new MyBinding());
dsl.execute ("delete from fieldhistory where createddate <= {0} and object = {1}", 
    val(beforeDate.toOffsetDateTime(), myType), 
    val(objName))

將來會對此進行修復,因此不再需要這樣做: https : //github.com/jOOQ/jOOQ/issues/9902

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM