невозможно использовать setobject для пользовательской привязки в jooq

public class DestinationCustomBinding implements Binding<Object, Destination>{


    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private final Converter<Object, Destination> converter = new DestinationConverter();

    public Converter<Object, Destination> converter() {
        // TODO Auto-generated method stub

        return converter;
    }

    public void sql(BindingSQLContext<Destination> ctx) throws SQLException {
        // TODO Auto-generated method stub
        Param<Integer> param = DSL.val(ctx.convert(converter).value(),Integer.class );

        ctx.render().visit(DSL.val(ctx.convert(converter).value(),Integer.class ));
    }

    public void register(BindingRegisterContext<Destination> ctx) throws SQLException {
        // TODO Auto-generated method stub
        ctx.statement().registerOutParameter(ctx.index(), Types.JAVA_OBJECT);
    }

    public void set(BindingSetStatementContext<Destination> ctx) throws SQLException {


        ctx.statement().setObject(ctx.index(), ctx.convert(converter).value(), null);
     //      ctx.statement().setString(ctx.index(), Objects.toString(ctx.convert(converter).value(), null));
    }

    public void set(BindingSetSQLOutputContext<Destination> ctx) throws SQLException {
        // TODO Auto-generated method stub
        throw new SQLFeatureNotSupportedException();
    }

    public void get(BindingGetResultSetContext<Destination> ctx) throws SQLException {
        // TODO Auto-generated method stub
         ctx.convert(converter).value(ctx.resultSet().getObject(ctx.index()));
    }

    public void get(BindingGetStatementContext<Destination> ctx) throws SQLException {
        // TODO Auto-generated method stub
        ctx.convert(converter).value(ctx.statement().getObject(ctx.index()));
    }

    public void get(BindingGetSQLInputContext<Destination> ctx) throws SQLException {
        // TODO Auto-generated method stub
        throw new SQLFeatureNotSupportedException();
    }

}

я хочу использовать setObject вместо setString в публичном недействительном наборе (BindingSetStatementContext ctx), но я получаю следующую ошибку

Caused by: java.sql.SQLFeatureNotSupportedException: setObject not implemented
    at java.sql.PreparedStatement.setObject(PreparedStatement.java:1291)
    at org.jooq.tools.jdbc.DefaultPreparedStatement.setObject(DefaultPreparedStatement.java:371)
    at com.shn.analytics.db.connection.utils.DestinationCustomBinding.set(DestinationCustomBinding.java:53)
    at org.jooq.impl.DefaultBindContext.bindValue0(DefaultBindContext.java:62)
    at org.jooq.impl.AbstractBindContext.bindValue(AbstractBindContext.java:127)
    ... 11 more

Вариант использования: я использую crate db, который принимает объекты типа Json (не Json) без кавычек Пример:

create table test_table ( 
  Id Integer, 
  name STRING, 
  test_Object OBJECT
);

insert into test_table(Id, test_Object) 
values (10, 'test_Name', {city = 'random_city'});

Как можно реализовать этот вариант использования в jooq


person Pradeep    schedule 09.08.2017    source источник
comment
Какую базу данных/драйвер JDBC вы используете?   -  person Lukas Eder    schedule 11.08.2017
comment
я использую crate db (crate.io). Драйвер jdbc (crate.io/docs/clients/jdbc) — это postgres, и я использую Источник данных HikariCP для получения соединений   -  person Pradeep    schedule 11.08.2017
comment
Каково определение `DestinationConverter`?   -  person aristotll    schedule 14.08.2017


Ответы (1)


Во многих драйверах JDBC вы не можете использовать PreparedStatement.setObject(index, null), потому что драйвер JDBC должен знать, какой тип NULL он должен сериализовать по сети на сервер. Я не знаю, что здесь ожидает crate.io (это официально не поддерживаемая база данных в jOOQ), но обычные варианты:

// Using String
stmt.setString(index, null);

// Use setNull()
stmt.setNull(index, Types.OTHER);

В случае метода setNull() вполне может быть, что существует значение Types, зависящее от поставщика, более конкретное, чем Types.OTHER.

person Lukas Eder    schedule 14.08.2017