如何使用 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
【讨论】:
【参考方案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 数组的主要内容,如果未能解决你的问题,请参考以下文章