Jooq-将字段更新为NULL使其变为“ null”而不是NULL JSON.valueOf(null)与(JSON) null 使用Converter<JSON, String> converter = Converter.ofNullable( JSON.class, String.class, JSON::data, JSON::json ); 的注意事项

问题描述

所以这是我以前在jooq 3.11中使用的查询。

我正在更新JSON字段,但是使用JsonBinding将其映射到模型中的String,我将在其下方发布

        dsl.update(TASK)
            .set(TASK.JSON_SOLUTION,(String) null).            
        .where(TASK.TENANT.eq(getCurrentTenant()))
        .and(TASK.TASK_TEMPLATE_ID.in(taskTemplateIds));execute()

现在升级到jooq 3.13.2后,该功能不再起作用。即使我正在使用mysql 5_7数据库,我也不得不将sql方言更改为mysql,这可能是问题所在?

我也尝试过,但还是一样

        dsl.update(TASK)
            .setNull(TASK.JSON_SOLUTION).            
         .where(TASK.TENANT.eq(getCurrentTenant()))
        .and(TASK.TASK_TEMPLATE_ID.in(taskTemplateIds));execute()

JsonBinding.class

public class JsonBinding implements Binding<JSON,String> {

  @Override
  public Converter<JSON,String> converter() {
    return new JsonConverter();
  }

  @Override
  public void sql(BindingSQLContext<String> bindingSQLContext) {
    if (bindingSQLContext.render().paramType() == ParamType.INLINED) {
      bindingSQLContext
          .render()
          .visit(DSL.inline(bindingSQLContext.convert(converter()).value()))
          .sql("::json");
    } else {
      bindingSQLContext.render().sql("?");
    }
  }

  @Override
  public void register(BindingRegisterContext<String> bindingRegisterContext) throws SQLException {
    bindingRegisterContext
        .statement()
        .registerOutParameter(bindingRegisterContext.index(),Types.VARCHAR);
  }

  @Override
  public void set(BindingSetStatementContext<String> bindingSetStatementContext)
      throws SQLException {
    bindingSetStatementContext
        .statement()
        .setString(
            bindingSetStatementContext.index(),Objects.toString(bindingSetStatementContext.convert(converter()).value(),null));
  }

  @Override
  public void set(BindingSetSQLOutputContext<String> bindingSetSQLOutputContext)
      throws SQLException {
    throw new SQLFeatureNotSupportedException();
  }

  @Override
  public void get(BindingGetResultSetContext<String> bindingGetResultSetContext)
      throws SQLException {
    bindingGetResultSetContext
        .convert(converter())
        .value(
            JSON.valueOf(
                bindingGetResultSetContext
                    .resultSet()
                    .getString(bindingGetResultSetContext.index())));
  }

  @Override
  public void get(BindingGetStatementContext<String> bindingGetStatementContext)
      throws SQLException {
    bindingGetStatementContext
        .convert(converter())
        .value(
            JSON.valueOf(
                bindingGetStatementContext
                    .statement()
                    .getString(bindingGetStatementContext.index())));
  }

  @Override
  public void get(BindingGetSQLInputContext<String> bindingGetSQLInputContext) throws SQLException {
    throw new SQLFeatureNotSupportedException();
  }
}

JsonConverter.class

public class JsonConverter implements Converter<JSON,String> {

  @Override
  public String from(JSON object) {
    return object != null ? object.toString() : null;
  }

  @Override
  public JSON to(String string) {
    return JSON.valueOf(string);
  }

  @Override
  public Class<JSON> fromType() {
    return JSON.class;
  }

  @Override
  public Class<String> toType() {
    return String.class;
  }
}

这是jooq使用.setNull()运行的查询

update `tasks_service`.`task` set `tasks_service`.`task`.`json_solution` = 'null'::json where (`tasks_service`.`task`.`tenant` = 'skynet' and `tasks_service`.`task`.`task_template_id` in ('55','33'))

在jooq 3.11升级之前,查询是这样

update `tasks_service`.`task` set `tasks_service`.`task`.`json_solution` = null::json where (`tasks_service`.`task`.`tenant` = 'skynet' and `tasks_service`.`task`.`task_template_id` in ('55','33'))

因此,在将其设置为'json_solution'= null之前,以及在升级之后,似乎将其设置为'json_solution'='null'

不太确定为什么会这样吗?

编辑:因此,据我所知,这似乎完全来自于JOOQ的升级,而不是sql-dialect。如果同时将Jooq 3.11.5与mysql和mysql_5_7用作方言,则将查询构建为set'json_solution'= null,如果我将JOOQ升级到3.13.2,则将其set'json_solution'='null'

这个怪癖似乎也只发生在JSON字段上,我尝试将同一表上的另一个varchar String字段设置为null,然后得到正确的设置“ field_name'= null

问题可能出在我的JsonBinding / JsonConverter吗?我必须对其稍作修改,以便与JOOQ中的新JSON对象一起使用,因为以前的JOOQ将JSON映射为Object

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)