postgresql - 为特定的 JOOQ 列自动转换 RHS 值

标签 postgresql jooq

我有以下代码,其中“CI_COL”的类型为 citext ( https://www.postgresql.org/docs/current/static/citext.html )

String str = "testING";

int countBad = context.fetchCount(select(Tables.MY_TABLE.CI_COL)
  .from(Tables.MY_TABLE)
  .where(Tables.MY_TABLE.CI_COL.eq(str)));

int countGood = context.fetchCount(select(Tables.MY_TABLE.CI_COL)
  .from(Tables.MY_TABLE)
  .where(Tables.MY_TABLE.CI_COL.eq(cast(str, new DefaultDataType<>(SQLDialect.POSTGRES, String.class, "citext")))));

第一个查询返回0,第二个查询正确返回>0。

我花了很长时间才找到根本原因,因为当打印出第一个查询(或在 DEBUG 日志记录中找到)时,它似乎在终端中执行得很好。

一旦我深入到语句级别并实际开始绑定(bind)值,这似乎就是根本原因所在。这似乎是 postgres 驱动程序中的一个问题(或故意的)。这篇文章说明了 citext 的绑定(bind)问题:https://www.postgresql.org/message-id/CAJFs0QB90bo0vWw5pZcw0c%3DLjOcOX04qPEM4nSd6uY7-T2r5hA%40mail.gmail.com

是否可以通过让 JOOQ 自动对特定列的所有右侧值执行转换来在 JOOQ 级别修复此问题?

最佳答案

旁注

new DefaultDataType<>(...)

喘息!您正在使用内部 API :)

正确的解决方案

在 jOOQ 中引入新数据类型的正确方法是使用 Converter,或者在本例中是数据类型 Binding:

http://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings

虽然大多数 Binding 方法的实现会简单地委托(delegate)给 jOOQ 的 DefaultBinding,但您可以覆盖 sql() 方法(它生成绑定(bind)变量的SQL 字符串)到这个:

@Override
public void sql(BindingSQLContext<JsonElement> ctx) throws SQLException {
    ctx.render().sql("?::citext");
}

关于postgresql - 为特定的 JOOQ 列自动转换 RHS 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39375296/

相关文章:

node.js - 使用 node-postgres 在 postgres 中存储文件

ruby-on-rails - 使用 Ruby on Rails 在 postgres 中存储二进制对象

ruby-on-rails - Heroku 迁移失败 UndefinedTable 错误

java - 在 JOOQ 中自动将 Integer[] 转换为 List<integer>

java - 按名称实例化 jooq Field<>

Postgresql - 数字主键的人类可读别名

java - 在一次调用中关闭连接、PreparedStatement 和 ResultSet

mysql - 更新数据库时如何解决 NullPointerException

java, tomcat8 : MYSQL query start to become very low after some hours that the deploy of a new . war已经搞定

java - 如何在 JOOQ 中手动创建 RecordN 实例?