sql >> データベース >  >> RDS >> PostgreSQL

SpringJPAでpostgres配列をマッピング中にエラーが発生しました

    @ 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. SQL TRUNCATE構文–DBMSによってリストされています

    2. LISTAGG関数:文字列連結の結果が長すぎます

    3. Laravel-5'LIKE'相当(Eloquent)

    4. DAYOFYEAR()の例– MySQL