转换枚举列表,然后存储为' varchar []'

发布于 2025-01-28 17:41:49 字数 2090 浏览 3 评论 0原文

试图弄清楚如何在单个表列中存储枚举列表。

我从字符串开始,然后起作用。我将仅显示代码的相关部分:

import com.vladmihalcea.hibernate.type.array.ListArrayType;

...

@Entity
@TypeDefs({
    @TypeDef(
        name = "list-array",
        typeClass = ListArrayType.class
    )
})
@Table(name = "reports")
public class Reports {
...

    @Type( type = "list-array" )
    @Column(
        name = "origins",
        columnDefinition = "varchar[]",
        nullable = false
    )
    private List<String> origins;

...

PostgreSQL中的列的相应DDL定义为

origins _varchar NULL

Liquibase脚本中:

<column name="origins" type="varchar[]" remarks=""/>

但是,当我尝试将枚举存储以以下更改的枚举时(我基本上更改了类型和相应的内容GetTers/Setters)

private List<Origin> origins;

枚举代码看起来如此:

public enum Origin {
 A, B, C
}

我有错误:

nested exception is org.hibernate.MappingException: Could not instantiate Type: com.vladmihalcea.hibernate.type.array.ListArrayType

我还尝试了转换器,但没有成功:

@Column(
        name = "origins",
        columnDefinition = "varchar[]",
        nullable = false
)
@Convert(converter = OriginConverter.class)
private List<Origin> origins;

转换器代码下面:

@Converter
public class OriginConverter implements AttributeConverter<List<Origin>, List<String>> {

    @Override
    public List<String> convertToDatabaseColumn(List<Origin> origins) {
        List<String> values = new ArrayList<>();
        origins.forEach(
            origin -> values.add(origin.name())
        );
        return values;
    }

    @Override
    public List<Origin> convertToEntityAttribute(List<String> origins) {
        var values= origins.stream().map(Origin::valueOf).toList();
        return values;
    }
}

错误是:

could not insert...
...
Caused by: org.postgresql.util.PSQLException: Unsupported Types value: 21,685,669

我缺少什么?

Trying to figure out how to store a list of enums in a single table column.

I started with a String and it worked. I'll show only the relevant parts of the code:

import com.vladmihalcea.hibernate.type.array.ListArrayType;

...

@Entity
@TypeDefs({
    @TypeDef(
        name = "list-array",
        typeClass = ListArrayType.class
    )
})
@Table(name = "reports")
public class Reports {
...

    @Type( type = "list-array" )
    @Column(
        name = "origins",
        columnDefinition = "varchar[]",
        nullable = false
    )
    private List<String> origins;

...

The corresponding DDL of the column in PostgreSQL is defined as

origins _varchar NULL

In Liquibase script:

<column name="origins" type="varchar[]" remarks=""/>

However when I tried to store enums with the following changes to the code (I basically changed the type and the corresponding getters/setters)

private List<Origin> origins;

The enum code looks so:

public enum Origin {
 A, B, C
}

I got the error:

nested exception is org.hibernate.MappingException: Could not instantiate Type: com.vladmihalcea.hibernate.type.array.ListArrayType

I also tried it with a converter but without success:

@Column(
        name = "origins",
        columnDefinition = "varchar[]",
        nullable = false
)
@Convert(converter = OriginConverter.class)
private List<Origin> origins;

The converter code is below:

@Converter
public class OriginConverter implements AttributeConverter<List<Origin>, List<String>> {

    @Override
    public List<String> convertToDatabaseColumn(List<Origin> origins) {
        List<String> values = new ArrayList<>();
        origins.forEach(
            origin -> values.add(origin.name())
        );
        return values;
    }

    @Override
    public List<Origin> convertToEntityAttribute(List<String> origins) {
        var values= origins.stream().map(Origin::valueOf).toList();
        return values;
    }
}

The error was:

could not insert...
...
Caused by: org.postgresql.util.PSQLException: Unsupported Types value: 21,685,669

What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文