PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lỗi khi ánh xạ các mảng postgres trong Spring JPA

Giống như @ jeff-wang đã chỉ ra, các kiểu mảng Postgres không được JPA hỗ trợ. Các triển khai ánh xạ cụ thể có thể được thêm theo cách thủ công, nhưng @ vlad-mihalcea đã cung cấp triển khai mẫu. Bạn nhận được nó từ trung tâm maven:

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

Bạn có thể tham khảo thêm chi tiết tại đây:https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/

Sau khi giải quyết sự phụ thuộc, cần phải thêm một triển khai cho ánh xạ cụ thể. Hãy để chúng tôi lấy Postgres bigint[] như một ví dụ. Nó có thể được ánh xạ tới ví dụ Long[] . Đầu tiên, chúng ta cần thêm bộ mô tả cho loại mong muốn:

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

Sau đó, lớp ánh xạ thực tế:

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

Điều đó đang được thực hiện, tất cả những gì còn lại phải làm là xem xét các ánh xạ của chúng ta trong cấu hình Spring. Tôi đang giữ riêng cấu hình mô hình dữ liệu của mình ở dạng dựa trên chú thích:

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

Bây giờ mọi thứ đã sẵn sàng để sử dụng. Cột ví dụ được chú thích với ánh xạ mới được thêm vào trong định nghĩa DAO trông giống như sau:

@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. Làm thế nào để trả về kết quả của một SELECT bên trong một hàm trong PostgreSQL?

  2. Sửa chữa Postgresql sau khi nâng cấp lên OSX 10.7 Lion

  3. Lỗi ứng dụng thử nghiệm django - Gặp lỗi khi tạo cơ sở dữ liệu thử nghiệm:quyền tạo cơ sở dữ liệu bị từ chối

  4. Sẽ tốt hơn nếu sử dụng nhiều cơ sở dữ liệu với một lược đồ, hay một cơ sở dữ liệu với nhiều lược đồ?

  5. Cột động trong postgres câu lệnh SELECT