当前位置: 首页 > 知识库问答 >
问题:

内部属性不会在JOOQ中自动强制转换

施令秋
2023-03-14

我有如下表格:

    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的新手。如果我错过了什么,请告诉我。提前谢谢。

共有2个答案

云光明
2023-03-14

jOOQ无法理解您的@JsonProperty和其他开箱即用的注释。您必须实现自己的记录映射器来支持它们:https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos-with-recordmapper-provider/

薛栋
2023-03-14

我使用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;
    }
}
 类似资料:
  • 给出此SO线程中给出的最后一个示例。 我得到这个错误: 我应该使用jooq会满意的特殊映射器吗? 欢迎任何帮助 编辑: Jooq版本:3.14.3 Postgres:11 dto公司 我也尝试过使用SimpleFlatMapper 但是得到 我正在使用spring boot,以下是我对jackson的依赖: 堆栈跟踪:

  • 问题内容: 情况: 我想用由詹金斯(1.642.4)触发的SonarQube(5.4)分析我的项目。它是使用maven构建的Java项目。 我看到两种触发分析的方法: 发布构建操作“使用maven进行SonarQube分析”,但 已弃用 ,所以我不想使用它 推荐的构建后步骤是“执行SonarQube扫描仪”。 问题: 如果我使用了不赞成使用的Post Build Action,那么声纳项目配置的属

  • 情况: 我想用由Jenkins(1.642.4)触发的SonarQube(5.4)来分析我的项目。这是一个用Maven构建的java项目。 我看到了两种触发分析的方法: null 问题: 如果我使用不推荐使用的Post Build操作,则sonar项目配置的属性将自动从项目POM派生。 如果我使用推荐的构建后步骤,我将收到异常 必须为“Unknown”定义以下强制属性:Sonar.ProjectK

  • 我有一个标准的长领域 但它是在过程中填充的,并且具有随机值。如果我试图通过DAO将其添加到数据库中,则该id不会被autoGenerate sqlite引擎覆盖 如果我这样做类型字段为空,它也不起作用 有一种方法可以将id字段中的任何值强制转换为db中的自动增量值? 我从存储库livedata恢复数据。在视图模型

  • 和标题差不多。我在请求正文中有一个可选对象。但是,如果给定了该对象,则它必须包含几个子属性。 我的OpenAPI组件配置如下所示: 我正在使用express openapi validator来验证这一点。现在,我不明白这是否是express openapi validator包的问题,但可选字段(partner)的必填字段(名称、电话)从未验证过。我可以只提供合作伙伴:{},然后直接插入,或者甚