2017-08-09 29 views
6
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(); 
    } 

} 

chcę używać setObject zamiast setString w public void set (BindingSetStatementContext CTX), ale otrzymuję następujący błądnie mogli korzystać setObject za zwyczaj wiązania w jooq

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 

przypadek użycia: Używam paka db który akceptuje JSON jak (nie) obiektów JSON bez cudzysłowów Ex:

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'}); 

w jaki sposób można wdrożyć ten przypadek użycia w jooq

+0

Jakiej bazy danych/sterownika JDBC używasz? –

+0

Używam db skrzynki (https://crate.io/). Sterownik jdbc to postgres (https://crate.io/docs/clients/jdbc/) i używam źródła danych HikariCP do uzyskania połączeń – Pradeep

+0

Jaka jest definicja "DestinationConverter"? – aristotll

Odpowiedz

3

W wielu sterownikach JDBC nie można używać PreparedStatement.setObject(index, null), ponieważ sterownik JDBC musi wiedzieć, co to jest typ z NULL, który powinien serializować na drucie do serwera. Nie wiem, co crate.io oczekuje tutaj (to nie jest oficjalnie wspierany w bazie w jOOQ), ale zwykle są następujące opcje:

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

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

W przypadku metody setNull(), to może okazać się, że istnieje specyficzna dla dostawcy wartość: bardziej szczegółowa niż Types.OTHER.