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

Hibernateを使用してPostgreSQL配列をマップする方法

    Mavenの依存関係

    最初に行う必要があるのは、プロジェクトpom.xmlに次のHibernateTypesMaven依存関係を設定することです。 構成ファイル:

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

    データベースにこのテーブルがあると仮定します:

    create table event (
        id int8 not null, 
        version int4, 
        sensor_names text[], 
        sensor_values integer[], 
        primary key (id)
    )
    

    そして、次のようにマッピングします:

    @Entity(name = "Event")
    @Table(name = "event")
    @TypeDefs({
        @TypeDef(
            name = "string-array", 
            typeClass = StringArrayType.class
        ),
        @TypeDef(
            name = "int-array", 
            typeClass = IntArrayType.class
        )
    })
    public static class Event extends BaseEntity {
     
        @Type( type = "string-array" )
        @Column(
            name = "sensor_names", 
            columnDefinition = "text[]"
        )
        private String[] sensorNames;
     
        @Type( type = "int-array" )
        @Column(
            name = "sensor_values", 
            columnDefinition = "integer[]"
        )
        private int[] sensorValues;
     
        //Getters and setters omitted for brevity
    }
    

    string-array およびint-array BaseEntityで定義できるカスタムタイプです スーパークラス:

    @TypeDefs({
        @TypeDef(
            name = "string-array", 
            typeClass = StringArrayType.class
        ),
        @TypeDef(
            name = "int-array", 
            typeClass = IntArrayType.class
        )
    })
    @MappedSuperclass
    public class BaseEntity {
    
        @Id
        private Long id;
    
        @Version
        private Integer version;
    
        //Getters and setters omitted for brevity
    }
    

    StringArrayType およびIntArrayType HibernateTypesプロジェクトによって提供されるクラスです。

    テスト時間

    ここで、いくつかのエンティティを挿入すると、

    Event nullEvent = new Event();
    nullEvent.setId(0L);
    entityManager.persist(nullEvent);
     
    Event event = new Event();
    event.setId(1L);
    event.setSensorNames(
        new String[] {
            "Temperature", 
            "Pressure"
        }
    );
    event.setSensorValues( 
        new int[] {
            12, 
            756
        } 
    );
    entityManager.persist(event);
    

    Hibernateは次のSQLステートメントを生成します:

    INSERT INTO event (
        version, 
        sensor_names, 
        sensor_values, 
        id
    ) 
    VALUES (
        0, 
        NULL(ARRAY), 
        NULL(ARRAY), 
        0
    )
         
    INSERT INTO event (
        version, 
        sensor_names, 
        sensor_values, 
        id
    ) 
    VALUES ( 
        0, 
        {"Temperature","Pressure"}, 
        {"12","756"}, 
        1
    )
    


    1. 行ごとではなく、DataTable全体を一度にデータベースに挿入しますか?

    2. [更新された2020-01-23]MicrosoftOffice365ビルド1912はODBCリンクテーブルのIDを破壊します

    3. MySQLでのLTRIM()関数のしくみ

    4. 指定された名前と引数のタイプに一致する関数はありません