首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jooq-将字段更新为NULL使其为" NULL“和NULL。

Jooq-将字段更新为NULL使其为" NULL“和NULL。
EN

Stack Overflow用户
提问于 2020-08-12 09:08:19
回答 1查看 1.4K关注 0票数 1

这就是我以前在jooq3.11中使用的查询。

我正在更新一个JSON字段,但是它将使用JsonBinding映射到模型中的一个字符串,我将在下面发布

代码语言:javascript
运行
复制
        dsl.update(TASK)
            .set(TASK.JSON_SOLUTION, (String) null).            
        .where(TASK.TENANT.eq(getCurrentTenant()))
        .and(TASK.TASK_TEMPLATE_ID.in(taskTemplateIds));execute()

在升级到jooq3.13.2之后,这个功能就不再起作用了。我还不得不将我的sql方言改为mysql,即使我正在使用mysql 5_7数据库,这可能是问题所在吗?

我也试过这个,它还是一样的。

代码语言:javascript
运行
复制
        dsl.update(TASK)
            .setNull(TASK.JSON_SOLUTION).            
         .where(TASK.TENANT.eq(getCurrentTenant()))
        .and(TASK.TASK_TEMPLATE_ID.in(taskTemplateIds));execute()

JsonBinding.class

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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;
  }
}

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

代码语言:javascript
运行
复制
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上进行升级之前,查询结果如下

代码语言:javascript
运行
复制
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'))

所以在它的set 'json_solution‘= null之前和升级之后,它似乎被设置为'json_solution’= 'null‘

不太清楚为什么会发生这种事?

编辑:所以据我所知,这似乎完全来自于JOOQ的升级,而不是sql方言。如果我将Jooq升级到3.13.2,它的集合‘mysql_5_7’= 'json_solution‘= ' null’,则使用JOQ3.11.5同时使用mysql和json_solution作为方言构建查询。

这种怪癖似乎也只发生在JSON字段上,我尝试在同一个表上设置另一个varchar字段为null,并得到正确的集"field_name‘=空“

问题可能是我的JsonBinding/ with转换器?为了在JOOQ中使用新的JSON对象,我不得不稍微修改它,因为以前JOOQ将JSON映射为对象

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-13 07:46:14

JSON.valueOf(null)(JSON) null

答案在org.jooq.JSON的Javadoc中。

CAST(NULL AS JSON)值由JSON类型的null引用表示,而不是以data() == null表示。这与jOOQ从ResultRecord方法返回Record的一般方法是一致的。

因此,错误在于JsonConverterJSON.valueOf()的使用。

代码语言:javascript
运行
复制
  public JSON to(String string) {
    return string == null ? null : JSON.valueOf(string);
  }

或者,只需使用Converter.ofNullable(),它为您处理空到空的映射:

代码语言:javascript
运行
复制
Converter<JSON, String> converter = Converter.ofNullable(
  JSON.class,
  String.class,
  JSON::data,
  JSON::json
);

关于使用Binding的附带注意事项

您不再需要绑定了,因为JSON类型是由jOOQ本地支持的。如果您想将JSON转换为String,您的Converter就足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63373341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档