这就是我以前在jooq3.11中使用的查询。
我正在更新一个JSON字段,但是它将使用JsonBinding映射到模型中的一个字符串,我将在下面发布
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数据库,这可能是问题所在吗?
我也试过这个,它还是一样的。
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;
}
}
下面是使用.setNull()运行的查询jooq
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'))
所以在它的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映射为对象
发布于 2020-08-13 07:46:14
JSON.valueOf(null)
对(JSON) null
答案在org.jooq.JSON
的Javadoc中。
CAST(NULL AS JSON)
值由JSON
类型的null
引用表示,而不是以data() == null
表示。这与jOOQ从Result
和Record
方法返回Record
的一般方法是一致的。
因此,错误在于JsonConverter
对JSON.valueOf()
的使用。
public JSON to(String string) {
return string == null ? null : JSON.valueOf(string);
}
或者,只需使用Converter.ofNullable()
,它为您处理空到空的映射:
Converter<JSON, String> converter = Converter.ofNullable(
JSON.class,
String.class,
JSON::data,
JSON::json
);
关于使用Binding
的附带注意事项
您不再需要绑定了,因为JSON
类型是由jOOQ本地支持的。如果您想将JSON
转换为String
,您的Converter
就足够了。
https://stackoverflow.com/questions/63373341
复制相似问题