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

JOOQを使用してPostgreSQLにJSON列を含む更新可能なレコードを挿入するにはどうすればよいですか?

    現在のjOOQバージョン

    jOOQはJSONをネイティブでサポートしています およびJSONB データ型なので、特定のことをする必要はありません。

    歴史的な答え

    jOOQ 3.5以降、ここに記載されているように、独自のカスタムデータ型バインディングをコードジェネレーターに登録できます。

    http://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

    Converterとは異なり 、Binding jOOQが実装について知らなくても、jOOQ内のJDBCレベルでデータ型がどのように処理されるかを指示します。つまり、<T>間の変換方法を定義するだけではありません および<U> タイプ(T =データベースタイプ、U =ユーザータイプ)。ただし、そのようなタイプを定義することもできます。

    • SQLとしてレンダリング
    • PreparedStatementsにバインド
    • SQLOutputにバインド
    • CallableStatementsにOUTパラメータとして登録
    • ResultSetから取得
    • SQLInputから取得
    • CallableStatementsからOUTパラメータとして取得

    Bindingの例 JacksonでJsonNodeを生成するために使用します タイプはここにあります:

    public class PostgresJSONJacksonJsonNodeBinding 
    implements Binding<Object, JsonNode> {
    
        @Override
        public Converter<Object, JsonNode> converter() {
            return new PostgresJSONJacksonJsonNodeConverter();
        }
    
        @Override
        public void sql(BindingSQLContext<JsonNode> ctx) throws SQLException {
    
            // This ::json cast is explicitly needed by PostgreSQL:
            ctx.render().visit(DSL.val(ctx.convert(converter()).value())).sql("::json");
        }
    
        @Override
        public void register(BindingRegisterContext<JsonNode> ctx) throws SQLException {
            ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR);
        }
    
        @Override
        public void set(BindingSetStatementContext<JsonNode> ctx) throws SQLException {
            ctx.statement().setString(
                ctx.index(), 
                Objects.toString(ctx.convert(converter()).value()));
        }
    
        @Override
        public void get(BindingGetResultSetContext<JsonNode> ctx) throws SQLException {
            ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index()));
        }
    
        @Override
        public void get(BindingGetStatementContext<JsonNode> ctx) throws SQLException {
            ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
        }
    
        // The below methods aren't needed in PostgreSQL:
    
        @Override
        public void set(BindingSetSQLOutputContext<JsonNode> ctx) throws SQLException {
            throw new SQLFeatureNotSupportedException();
        }
    
        @Override
        public void get(BindingGetSQLInputContext<JsonNode> ctx) throws SQLException {
            throw new SQLFeatureNotSupportedException();
        }
    }
    

    そしてConverter 上で使用されているものはここで見ることができます:

    public class PostgresJSONJacksonJsonNodeConverter 
    implements Converter<Object, JsonNode> {
        @Override
        public JsonNode from(Object t) {
            try {
                return t == null 
                  ? NullNode.instance 
                  : new ObjectMapper().readTree(t + "");
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public Object to(JsonNode u) {
            try {
                return u == null || u.equals(NullNode.instance) 
                  ? null 
                  : new ObjectMapper().writeValueAsString(u);
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public Class<Object> fromType() {
            return Object.class;
        }
    
        @Override
        public Class<JsonNode> toType() {
            return JsonNode.class;
        }
    }
    

    これで、コードジェネレーター構成を介して上記のバインディングを登録できます。

    <customType>
        <name>com.example.PostgresJSONJacksonJsonNodeBinding</name>
        <type>com.fasterxml.jackson.databind.JsonNode</type>
        <binding>com.example.PostgresJSONJacksonJsonNodeBinding</binding>
    </customType>
    
    <forcedType>
        <name>com.example.PostgresJSONJacksonJsonNodeBinding</name>
        <expression>my_schema\.table\.json_field</expression>
    </forcedType>
    



    1. SQLServerのビューからSCHEMABINDINGを削除します

    2. Debian/UbuntuでのPostgreSQLレプリケーションセットアップの作成

    3. PostgreSQLで先行ゼロを追加する2つの方法

    4. SQLServerでONDELETESETNULLオプションを使用して外部キー制約を作成する方法-SQLServer/TSQLチュートリアルパート81