Внутреннее свойство автоматически не разыгрывается в JOOQ - PullRequest
0 голосов
/ 15 октября 2019

У меня есть таблица, как показано ниже:

    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 ]

1 голос
/ 18 октября 2019

Я решил свою проблему с помощью конвертера 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;
    }
}
0 голосов
/ 16 октября 2019

jOOQ не понимает ваши @JsonProperty и другие аннотации из коробки. Вы должны будете реализовать свой собственный картограф для их поддержки: https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos-with-recordmapper-provider/

...