Это был мой запрос, который раньше работал в jooq 3.11.
Я обновляю поле JSON, однако в моей модели оно отображается на String с помощью привязки JsonBinding, которую я опубликую ниже.
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. Мне также пришлось изменить свой диалект sql на mysql, хотя я работаю с базой данных mysql 5_7, это может быть проблемой?
Я тоже пробовал это, и он все тот же
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-диалекте. Используя Jooq 3.11.5 с mysql и mysql
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'))
7 в качестве диалектов, запрос строится как set 'json_solution' = null, если я обновляю JOOQ до 3.13.2, его set 'json_solution' = 'null'
Эта причуда также, кажется, происходит только в поле JSON, я попытался установить другое поле строки varchar String равным null в той же таблице, и я получил правильный набор field_name '= null
Проблема может быть в моем JsonBinding / JsonConverter? Мне пришлось немного изменить его, чтобы работать с новым объектом JSON в JOOQ, поскольку ранее JOOQ отображал JSON как объект