Postgres varchar 数组与 Java/Kotlin 枚举集合之间的 Hibernate 映射

问题描述 投票:0回答:3

基本上一切都在标题中。

我的数据库中有一个列,它是

varchar[]

我真的很想将它映射到 Java/Kotlin

enum
。我们已经完成了将其作为
String
列表(通过
com.vladmihalcea:hibernate-types
StringArrayType
)获取的工作,但不映射到枚举。你知道这是否可能吗?

既然我们知道如何将

varchar
映射到
enum
,以及如何将
varchar[]
映射到
String
的集合,我很想认为这应该是可能的,但我还没有成功。

这是我当前配置的一个简单示例:

CREATE TABLE test(my_values varchar[]) ;
INSERT INTO test(my_values) values ('{VAL1, VAL2}')
@Entity
@Table(name = "test")
data class DbTest(
        @Column(name = "my_values")
        val myValues: List<Values>
)

enum class Values {
       VAL1, VAL2
}

我尝试了这个:https://vladmihalcea.com/map-postgresql-enum-array-jpa-entity-property-hibernate/看起来不错,但你必须在数据库中定义枚举,而我们没有想要那个。

谢谢!

java postgresql hibernate kotlin hibernate-mapping
3个回答
2
投票

以前的答案对我不起作用,但这个有效:

    TypeDef(
      name = "enums-array",
      typeClass = ListArrayType::class,
      parameters = [Parameter(name = EnumArrayType.SQL_ARRAY_TYPE, value = "varchar")]
    )

1
投票

我正在发布我的解决方案,但我没有成功获得

List<Values>
,尽管我得到了
Array<Values>
,这对我来说很好。

@Entity
@Table(name = "test")
@TypeDef(
        name = "values-array",
        typeClass = EnumArrayType::class,
        defaultForType = Array<Values>::class,
        parameters = [
          Parameter(
                  name = EnumArrayType.SQL_ARRAY_TYPE,
                  value = "varchar"
          )
        ]
)
data class DbTest(
        @Type(type = "values-array")
        @Column(name = "my_values", columnDefinition = "varchar[]")
        val myValues: Array<Values>
)

enum class Values {
       VAL1, VAL2
}

这就像一个魅力,我可以很容易地将我的数组映射到列表,反之亦然,这没关系。

希望有一天这会对某人有所帮助;)


0
投票

如果使用 Hibernate 版本 > 6,则此更改应该如下所示:

@Type(StringArrayType.class)
@Column(
    name = "sensor_names",
    columnDefinition = "text[]"
)
private String[] sensorNames;

@Type(IntArrayType.class)
@Column(
    name = "sensor_values",
    columnDefinition = "integer[]"
)
private int[] sensorValues;

@Type(
    value = EnumArrayType.class,
    parameters = @Parameter(
        name = AbstractArrayType.SQL_ARRAY_TYPE,
        value = "sensor_state"
    )
)
@Column(
    name = "sensor_states",
    columnDefinition = "sensor_state[]"
)
private SensorState[] sensorStates;
© www.soinside.com 2019 - 2024. All rights reserved.