java - 内部属性不会在 JOOQ 中自动转换
问题描述
我有如下表格:
CREATE TABLE recipes
(
id INT AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
components JSON,
active BOOLEAN NULL DEFAULT TRUE,
PRIMARY KEY (id),
UNIQUE KEY (name)
)
CHARACTER SET "UTF8"
ENGINE = InnoDb;
我创建了如下 pojo 类:
@JsonIgnoreProperties(ignoreUnknown = true)
public class CValueRecipeV2
{
@JsonProperty("components")
@JsonAlias("matcher.components")
@Column(name = "components")
@Valid
private List<CComponentV2> mComponents;
@JsonProperty("name")
@Column(name = "name")
private String name;
public List<CComponentV2> getComponents()
{
return mComponents;
}
public void setComponents(List<CComponentV2> mComponents)
{
this.mComponents = mComponents;
}
public String getName()
{
return mName;
}
public void setName(String mName)
{
this.mName = mName;
}
}
另一个班级
@JsonIgnoreProperties(ignoreUnknown = true)
public class CComponentV2
{
@JsonProperty("shingle_size")
@JsonAlias("shingleSize")
@CShingleField
private Integer mShingleSize;
public Integer getmShingleSize()
{
return mShingleSize;
}
public void setmShingleSize(Integer mShingleSize)
{
this.mShingleSize = mShingleSize;
}
}
现在我正在尝试使用 JOOQ 从数据库中获取记录。但我无法将 json 组件字符串转换为组件类。
我正在读取下表中的数据,如下所述:
context.dsl().select(RECIPES.asterisk())
.from(RECIPES)
.where(RECIPES.NAME.eq(name))
.fetchInto(CValueRecipeV2.class);
在数据库中,我有以下记录。
ID name components active
1 a [{"shingle_size=2"}] true
在获取数据时,我收到以下错误
Caused by: org.jooq.exception.DataTypeException: Cannot convert from {shingle_size=2} (class java.util.HashMap) to class com.ac.config_objects.CComponentV2
我是 JOOQ 的新手。如果我遗漏了什么,请告诉我。提前致谢。
解决方案
我已经使用 jooq 转换器解决了我的问题。
var record = context.dsl().select(RECIPES.asterisk())
.from(RECIPES)
.where(RECIPES.NAME.eq(name))
.fetchOne();
record.setValue(RECIPES.COMPONENTS, record.get(RECIPES.COMPONENTS, new CComponentV2Converter()));
var recipe = record.into(CValueRecipeV2.class);
我的转换器如下所示:
public class CComponentV2Converter implements Converter<Object, List<CComponentV2>>
{
static final long serialVersionUID = 0;
@Override
public List<CComponentV2> from(Object databaseObject)
{
var componentList = CObjectCaster.toMapList(databaseObject);
List<CComponentV2> cComponentV2s = new ArrayList<>();
componentList.forEach(e -> {
CComponentV2 cComponentV2 = new CComponentV2();
cComponentV2.setmShingleSize(CObjectCaster.toInteger(e.get("shingle_size")));
cComponentV2s.add(cComponentV2);
});
return cComponentV2s;
}
}
推荐阅读
- php - 数组总是返回相同的值
- django - Django:视图没有放置函数返回的值
- javascript - 是否可以使用 ES6 JavaScript 编写 Flutter 应用程序?
- dictionary - promise.all 不返回实际结果
- sharepoint - 删除相关项目字段中的“删除”和“添加相关项目”选项
- c++ - 为什么我在 OSX 终端和 Netbeans 上编译时会得到不同的结果
- java - 如何在处理中的计时器上增加全局变量?
- html - 如何在div中定位项目
- go - 在 Golang 中以编程方式模拟断开互联网连接
- python-3.x - 我如何给布尔值来决定我的时间戳是假期和周末还是不在python的Dataframe中