PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kesalahan saat memetakan array postgres di Spring JPA

Seperti yang ditunjukkan oleh @jeff-wang, tipe array Postgres tidak didukung oleh JPA. Implementasi pemetaan khusus dapat ditambahkan secara manual, tetapi @vlad-mihalcea telah menyediakan contoh implementasi. Anda mendapatkannya dari maven central:

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

Detail lebih lanjut dapat ditemukan di sini:https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/

Setelah menyelesaikan ketergantungan, implementasi untuk pemetaan khusus perlu ditambahkan. Mari kita ambil Postgres bigint[] sebagai contoh. Itu dapat dipetakan ke misalnya Long[] . Pertama, kita perlu menambahkan deskriptor untuk tipe yang diinginkan:

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";
    }
}

Setelah itu kelas pemetaan yang sebenarnya:

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);
    }
}

Setelah selesai, yang tersisa untuk dilakukan adalah mempertimbangkan pemetaan kita dalam konfigurasi Spring. Saya menyimpan konfigurasi model data saya secara terpisah dalam bentuk berbasis anotasi:

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 {
}

Sekarang semuanya siap digunakan. Contoh kolom yang dianotasi dengan pemetaan yang baru ditambahkan dalam definisi DAO terlihat seperti berikut:

@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. Kesalahan intarray postgresql:simbol tidak terdefinisi:pfree

  2. Apakah ada cara untuk menggunakan ARRAY di Entity Framework + PostgreSql

  3. Kumpulkan Kunci JSON Rekursif Di Postgres

  4. Mengekspor kueri PostgreSQL ke file csv menggunakan Python

  5. CONSTRAINT untuk memeriksa nilai dari tabel yang terkait dari jarak jauh (melalui join dll.)