首页 > 解决方案 > 如何注册处理 real[] 和 text[] 数组列类型的自定义 Hibernate ARRAY 类型

问题描述

我将Hibernate Types库用于自定义 Hibernate 类型。

我有两个CustomArrayType处理real[]text[]数组类型。

我可以CustomStringArrayType在 Hibernate Dialect 中注册一个(例如PostgreSQL94Dialect),但是如何注册两种类型?

以下是我的自定义方言,没有它我会收到方言未找到 2003 错误:

public class HibernateCustomDialect extends org.hibernate.dialect.PostgreSQL94Dialect {
    private static final Logger log = LoggerFactory.getLogger(HibernateCustomDialect.class);


    public HibernateCustomDialect() {
        super();
        log.info("Registering Custom Hibernate Dialect - {}", HibernateCustomDialect.class.getName());
        this.registerHibernateType(Types.ARRAY, CustomStringArrayType.class.getName());
    }
}

标签: javaarrayshibernatespring-data-jpahibernate-types

解决方案


CustomStringArrayType不是来自Hibernate Types项目。您可以做的是使用ListArrayType,它更通用,应该同时处理这两种情况real[]text[]同时允许您List在 Java 端使用 a :

@Entity(name = "Event")
@Table(name = "event")
@TypeDef(
    name = "list-array",
    typeClass = ListArrayType.class
)
public class Event {
 
    @Id
    private Long id;
 
    @Type(type = "list-array")
    @Column(
        name = "sensor_ids",
        columnDefinition = "uuid[]"
    )
    private List<UUID> sensorIds;
 
    @Type(type = "list-array")
    @Column(
        name = "sensor_names",
        columnDefinition = "text[]"
    )
    private List<String> sensorNames;
 
    @Type(type = "list-array")
    @Column(
        name = "sensor_values",
        columnDefinition = "integer[]"
    )
    private List<Integer> sensorValues;
 
    @Type(type = "list-array")
    @Column(
        name = "sensor_long_values",
        columnDefinition = "bigint[]"
    )
    private List<Long> sensorLongValues;
 
    @Type(
        type = "com.vladmihalcea.hibernate.type.array.ListArrayType",
        parameters = {
            @Parameter(
                name = ListArrayType.SQL_ARRAY_TYPE,
                value = "sensor_state"
            )
        }
    )
    @Column(
        name = "sensor_states",
        columnDefinition = "sensor_state[]"
    )
    private List<SensorState> sensorStates;
 
    @Type(type = "list-array")
    @Column(
        name = "date_values",
        columnDefinition = "date[]"
    )
    private List<Date> dateValues;
 
    @Type(type = "list-array")
    @Column(
        name = "timestamp_values",
        columnDefinition = "timestamp[]"
    )
    private List<Date> timestampValues;
 
    //Getters and setters omitted for brevity
}

推荐阅读