如何使用JPA和HibernateMapJava/Kotlin字符串数组和Postgres SQL数组

fcipmucu  于 2022-11-14  发布在  Java
关注(0)|答案(3)|浏览(133)

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

categories    | text[]         |           |          |

如何在实体类中声明字段?
我在Product.kt文件中尝试了以下操作,但它抛出了错误[ERROR]:ERROR: relation "product_categories" does not exist

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

我的目的是将字符串数组保存为实体的一个字段,我并不是要做任何与“一对多”相关的事情。
如果你知道任何Java版本的解决方案,并且它能工作,我也会接受这个答案。谢谢

nwo49xxi

nwo49xxi1#

Adam的答案适用于用Java编写的项目。由于我的项目是用Kotlin编写的,我在下面分享我的版本,希望它能帮助人们马上使用它,而不是花时间去转换:
有用资源:How to map Java and SQL arrays with JPA and Hibernate
波斯特格雷斯:

alter table product add column categories text[];

格瑞德:

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

Product.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之间有两个区别:
1.Kotlin中的数组类型是Array而不是String[],我也尝试了List,但没有成功。

  1. TypeDefs,TypeDef不同,没有@符号。
plicqrtu

plicqrtu2#

这在@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上尝试过,因为这Map到了Array。更多信息请参见this答案。

1aaf6o9v

1aaf6o9v3#

除了Haifeng提到的一个,对于Kotlin,还有另一个选项使用ListArrayType而不是StringArrayType,这样就不需要关心列表到数组的转换。
我遇到了另一个检索数据的问题,我有java.lang.ArrayStoreException: arraycopy: type mismatch: can not copy [Ljava.lang.String;[] into java.lang.String[]\n。只是对于那些可能也会遇到这个问题的人,我的问题是存储在DB中的数据不是数组,而是数组的数组。

相关问题