Java 内部属性不会在JOOQ中自动强制转换
我的表格如下:Java 内部属性不会在JOOQ中自动强制转换,java,validation,jooq,Java,Validation,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类: @JsonI
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;
}
}
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;
}
}
现在我正在尝试使用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不理解您的
@JsonProperty
和其他开箱即用的注释。您必须实现自己的记录映射器以支持它们:
我已使用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);
我的转换器如下所示:
@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;
}
}
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;
}
}
公共类CComponentV2Converter实现转换器
{
静态最终长SerialVersionId=0;
@凌驾
来自(对象数据库对象)的公共列表
{
var componentList=CObjectCaster.toMapList(数据库对象);
List cComponentV2s=新的ArrayList();
组件列表。forEach(e->{
CComponentV2 CComponentV2=新的CComponentV2();
cComponentV2.setmShingleSize(CObjectCaster.toInteger(e.get(“木瓦尺寸”));
cComponentV2.add(cComponentV2);
});
返回cComponentV2s;
}
}