您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Spring JPA中映射postgres数组时出错

在Spring JPA中映射postgres数组时出错

就像@ jeff-wang指出的那样,JPA不支持Postgres数组类型。可以手动添加特定的映射实现,但是@ vlad- mihalcea已经提供了示例实现。您可以从Maven Central获得它:

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

可以在这里找到更多详细信息:https : //vladmihalcea.com/how-to-map-java-and-sql-arrays- with-jpa-and-hibernate/

解决依赖关系后,需要添加特定映射的实现。让我们以Postgresbigint[]为例。例如,可以将其映射到Long[]。首先,我们需要为所需的类型添加描述符:

import com.vladmihalcea.hibernate.type.array.internal.AbstractArrayTypeDescriptor;

public class LongArrayTypeDescriptor extends AbstractArrayTypeDescriptor<Long[]> {
    public static final LongArrayTypeDescriptor INSTANCE = new LongArrayTypeDescriptor();

    public LongArrayTypeDescriptor() {
        super(Long[].class);
    }

    protected String getsqlArrayType() {
        return "bigint";
    }
}

之后是实际的映射类:

import com.vladmihalcea.hibernate.type.array.internal.ArraysqlTypeDescriptor;
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.usertype.DynamicParameterizedType;

import java.util.Properties;

public class LongArrayType extends AbstractSingleColumnStandardBasicType<Long[]> implements DynamicParameterizedType {

    public static final LongArrayType INSTANCE = new LongArrayType();

    public LongArrayType() {
        super(ArraysqlTypeDescriptor.INSTANCE, LongArrayTypeDescriptor.INSTANCE);
    }

    public String getName() {
        return "long-array";
    }

    @Override
    protected boolean registerUnderJavaType() {
        return true;
    }

    @Override
    public void setParameterValues(Properties parameters) {
        ((LongArrayTypeDescriptor) getJavaTypeDescriptor()).setParameterValues(parameters);
    }
}

完成后,剩下要做的就是在Spring配置中考虑我们的映射。我将数据模型配置单独保留在基于注释的形式中:

import ibdb.model.mappers.LongArrayType;
import ibdb.model.mappers.ShortArrayType;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;

import javax.persistence.MappedSuperclass;

@TypeDefs({
        @TypeDef(
                name = "long-array",
                typeClass = LongArrayType.class
        ),
        @TypeDef(
                name = "short-array",
                typeClass = ShortArrayType.class
        )
})
@MappedSuperclass
public class DaoConfig {
}

现在一切准备就绪。在DAO定义中注有新添加的映射的示例列如下所示:

@Type(
        type = "long-array"
)
@Column(
        columnDeFinition = "bigint[]"
)
private Long[] author;
Postgres 2022/1/1 18:42:10 有321人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶