我有以下代码,其中" 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,第二个查询正确返回&gt; 0
我花了很长时间来追查根本原因,因为当打印第一个查询(或在DEBUG日志记录中找到)时,它似乎在终端中执行就好了。
一旦我进入声明级别并实际开始绑定值,那就是根本原因所在。这似乎是postgres驱动程序中的一个问题(或故意)。这篇文章说明了citext:https://www.postgresql.org/message-id/CAJFs0QB90bo0vWw5pZcw0c%3DLjOcOX04qPEM4nSd6uY7-T2r5hA%40mail.gmail.com
的绑定问题通过让JOOQ自动对特定列的所有右侧值执行强制转换,是否可以在JOOQ级别修复此问题?
答案 0 :(得分:1)
new DefaultDataType<>(...)
Ghasp!您正在使用内部API:)
在jOOQ中引入新数据类型的正确方法是使用Converter
,或者在这种情况下使用数据类型Binding
:
http://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings
虽然大多数Binding
方法实现只是委托给jOOQ&#39; DefaultBinding
,但您可以覆盖sql()
方法(生成绑定变量&#39; s SQL字符串)对此:
@Override
public void sql(BindingSQLContext<JsonElement> ctx) throws SQLException {
ctx.render().sql("?::citext");
}