就像@ 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;