问题描述
所以这是我以前在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 (将#修改为@)