java - 为 JOOQ 的 DSL.val() 使用自定义转换器
问题描述
在我的应用程序中,使用java.util.UUID
. 在数据库中存储信息时,我使用的相应 MySQL 数据类型是BINARY(16)
. 的默认 JDBC 数据类型BINARY
是byte[]
. 所以我有一个org.jooq.Converter
在 UUID 和 byte[] 之间转换的习惯。
我有一个用例,我需要将表中的记录复制到同一个表中,但只复制某些列而不是全部。在我在这里发布的原始问题中,以下是解决方案
public void copy(UUID source, UUID target) {
jooq.insertInto(PERSON)
.columns(PERSON.ID, PERSON.FNAME, PERSON.LNAME)
.select(select(val(target), PERSON.FNAME, PERSON.LNAME)
.from(PERSON)
.where(PERSON.ID.eq(source)))
.execute();
}
但是执行这段代码导致了异常
Data truncation: Data too long for column 'id' at row 1
我发现这DSL.val()
没有使用我为将 UUID 转换为字节 [] 的自定义转换器。如何强制 DSL.val() 函数使用自定义转换器?
解决方案
解决方案:使用DSL.val(java.lang.Object value, DataType<T> type)
而不是仅仅使用DSL.val(java.lang.Object value)
以下是更新的代码片段
public void copy(UUID source, UUID target) {
DataType<UUID> uuidType = SQLDataType.BINARY
.asConvertedDataType(new UuidBinaryConverter());
jooq.insertInto(PERSON)
.columns(PERSON.ID, PERSON.FNAME, PERSON.LNAME)
.select(select(val(target, uuidType), PERSON.FNAME, PERSON.LNAME)
.from(PERSON)
.where(PERSON.ID.eq(source)))
.execute();
}
推荐阅读
- geoserver - 在 Geoserver 中禁用图层预览
- javascript - 如何仅选中和取消选中所有特定手风琴?
- c# - 如何使用 OleDb 获取视图的结构/查询?
- javascript - 如何将 ES6 类转换为 json 并将 json 解析为 javascript 中的该类对象
- reactjs - useReducer() 正在为一个组件返回数据,而对于另一个组件,它正在返回 initialState
- python - 在python中查找2个日期之间的天数,但只有数字
- python - 根据 Pandas 中的排名顺序创建新列
- ios - 在对模型进行任何更改时,使用 KVO 从模型更新表格单元格
- ms-access-2016 - 此查询返回数据,但如果 in 或 out 不存在,它会在 in 和 out 的两个列中显示值
- angular - Angular DevTools 不适用于 Angular aspnettemplate