gpt4 book ai didi

java - 无法在 jooq 中使用 setobject 进行自定义绑定(bind)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:31 24 4
gpt4 key购买 nike

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

}

我想在 public void set(BindingSetStatementContext ctx) 中使用 setObject 而不是 setString,但出现以下错误

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中实现这个用例

最佳答案

在许多 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.

关于java - 无法在 jooq 中使用 setobject 进行自定义绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45600476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com