如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组

Posted

技术标签:

【中文标题】如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组【英文标题】:How to map Java/Kotlin string array and Postgres SQL array with JPA and hibernate 【发布时间】:2021-02-05 02:02:45 【问题描述】:

我在 Postgres 中有一个数组类型的字段:

 categories    | text[]         |           |          |

如何在实体类中声明字段?

我在Product.kt 文件中尝试过,但它抛出错误[ERROR]:ERROR: relation "product_categories" does not exist

@ElementCollection
@Column(name = "categories")
var categories: List<String>? = emptyList()

我的目的是将字符串数组保存为实体的一个字段,我不想做任何与“一对多”相关的事情。

如果您知道任何 Java 版本的解决方案并且它有效,我也会接受答案。谢谢

【问题讨论】:

对于任何需要 Kotlin 版本的人,我已经发布了所有详细信息作为答案。 【参考方案1】:

Adam 的答案适用于用 Java 编写的项目。由于我的项目是用 Kotlin 编写的,所以我在下面分享我的版本,希望它有所帮助,人们可以立即使用它,而不是花时间进行转换:

有用资源:How to map Java and SQL arrays with JPA and Hibernate

Postgres:

alter table product add column categories text[];

分级:

implementation("com.vladmihalcea:hibernate-types-52:2.10.0")

产品.kt

import com.vladmihalcea.hibernate.type.array.StringArrayType
import org.hibernate.annotations.*
import javax.persistence.*
import javax.persistence.Entity


@TypeDefs(
    TypeDef(name = "string-array", typeClass = StringArrayType::class)
)
@Entity
class Product(
        var name: String,

        @Type(type = "string-array")
        @Column(name = "categories", columnDefinition = "text[]")
        var categories: Array<String>? = arrayOf(),
)

Java 和 Kotlin 之间有 2 个区别:

    Kotlin 中的数组类型是 Array 而不是 String[],我也试过 List,但没有成功。 TypeDefs,TypeDef 不同,没有@符号。

【讨论】:

【参考方案2】:

这不适用于@ElementCollection,因为它总是会尝试使用另一个表。您需要的是自定义类型。为此,您将需要此依赖项:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>$hibernate-types.version</version>
</dependency>

然后你可以定义你自己的类型:


import com.vladmihalcea.hibernate.type.array.StringArrayType

@TypeDefs(
    @TypeDef(
        name = "string-array", 
        typeClass = StringArrayType.class
    )
)
@Entity
class YourEntity 

    @Type( type = "string-array" )
    @Column(
        name = "categories", 
        columnDefinition = "character varying[]"
    )
    var categories: Array<String>;

不过,我还没有尝试使用 List,因为它映射到 Array。 this 答案中的更多信息。

【讨论】:

谢谢亚当。这是正确的方向,我已转换为 Kotlin 版本,一切正常!

以上是关于如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组的主要内容,如果未能解决你的问题,请参考以下文章

JPA休眠两个外键到同一个表

如何在唯一的映射或非对象 JPA 中返回多个结果

如何在 JPA 中映射名称为保留字的实体字段

PostgreSQL 枚举和 Java 枚举之间的休眠映射

无法使用 JPA 注释映射哈希图

如何在多对多关系上使用休眠和 JPA 删除孤立实体?