我有以下代码,其中“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/