自动为特定JOOQ列生成RHS值

时间:2016-09-07 16:40:35

标签: 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,第二个查询正确返回&gt; 0

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

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

的绑定问题

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

1 个答案:

答案 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");
}