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

JPA(EclipseLink)カスタムタイプは可能ですか?

    SOをウォークスルーすると、PostgresにマッピングするためのJSONまたはXMLタイプに関してこのような多くの質問が見つかりました。カスタムPostgres型からの読み取りの問題に誰も直面していないように見えるので、ここでは、純粋なJPA型変換メカニズムを使用した読み取りと書き込みの両方のソリューションを示します。

    Postgres JDBCドライバーは、不明な(Javaへの)タイプのすべての属性をorg.postgresql.util.PGobjectオブジェクトにマップするため、このタイプのコンバーターを作成するだけで十分です。エンティティの例は次のとおりです:

    @Entity
    public class Course extends AbstractEntity {
        @Column(name = "course_mapped", columnDefinition = "json")
        @Convert(converter = CourseMappedConverter.class)
        private CourseMapped courseMapped;  // have no idea why would you use String json instead of the object to map
    
        // getters and setters
    }
    

    ここにコンバーターの例があります:

    @Converter
    public class CourseMappedConverter implements AttributeConverter<CourseMapped, PGobject> {
        @Override
        public PGobject convertToDatabaseColumn(CourseMapped courseMapped) {
            try {
                PGobject po = new PGobject();
                // here we tell Postgres to use JSON as type to treat our json
                po.setType("json");
                // this is Jackson already added as dependency to project, it could be any JSON marshaller
                po.setValue((new ObjectMapper()).writeValueAsString(courseMapped));
                return po;
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                return null;
            } catch (SQLException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        @Override
        public CourseMapped convertToEntityAttribute(PGobject po) {
            try {
                return (new ObjectMapper()).readValue(po.getValue(),CourseMapped.class);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    

    エンティティで文字列JSON表現に固執する必要がある場合は、文字列型に対してこのようなコンバーターを作成できます

    implements AttributeConverter<String, PGobject>
    

    これは非常に汚い(機能しているものの)概念実証です。また、偽のオブジェクトシリアル化を使用して、オブジェクトが変更された場合は変更されたことをJPAに通知します

    https://github.com/sasa7812/psql-cache-evict-POC



    1. MYSQL現在の残高を以前の残高として照会する方法

    2. NHibernate.Driver.NpgsqlDriverからドライバーを作成できませんでした

    3. mysqlからmysqliコードエラーへの変更

    4. Mysqlを使用したサブクエリ(AGAINSTへの不正な引数)