PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Грешка при картографиране на postgres масиви в Spring JPA

Точно както @jeff-wang посочи, типовете масиви на Postgres не се поддържат от JPA. Специфични реализации на картографиране могат да се добавят ръчно, но @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/

След разрешаване на зависимостта трябва да се добави реализация за специфично картографиране. Нека вземем Postgres bigint[] като пример. Може да се съпостави например с 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизирайте обхвата на заявки за времеви печати на Postgres

  2. Получаване на име на текущата функция вътре във функцията с plpgsql

  3. Глави в облака в CHAR(10)

  4. Да дефинирате имената на таблици и колони като аргументи във функцията plpgsql?

  5. Приложението Spring Boot се забива на Hikari-Pool-1 - Стартиране...