gpt4 book ai didi

java - JDBI 是否接受 UUID 参数?

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

当使用 SQL 对象参数绑定(bind)时,JDBI使用 UUID 参数开箱即用?

我有这样的方法:

@SqlQuery("EXECUTE [MyProcedure] :myField")
MyDto myMethod(@Bind("myField") UUID myField);

它绑定(bind)到接收如下参数的 SQL Server 存储过程:

@myField uniqueidentifier

执行时抛出异常:

! com.microsoft.sqlserver.jdbc.SQLServerException: The conversion from UNKNOWN to UNKNOWN is unsupported.
! at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
! at com.microsoft.sqlserver.jdbc.DataTypes.throwConversionError(DataTypes.java:1117)
! at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:991)

如果我将 JDBI 上的参数类型更改为字符串,并使用 UUID 对象的 toString() 方法调用它,它会起作用:

@SqlQuery("EXECUTE [MyProcedure] :myField")
MyDto trash(@Bind("myField") String myField);

有没有办法编写接受 UUID 参数的 DAO 方法,并在绑定(bind)之前将它们转换为字符串?

最佳答案

JDBI 只为 JDBC 公开它们的类型公开显式基于类型的绑定(bind)。 JDBC 不公开用于绑定(bind)的 UUID 类型,因此它默认将其设置为对象。不幸的是,JDBC 没有提供明确的 UUID 绑定(bind)机制,所以通过 String 可能是最可移植的方式:-(

如果要在 Java 中将其绑定(bind)为 UUID 并在内部将其转换为 String,有两条路径。首先,如果您总是想将 UUID 绑定(bind)为字符串,则使用 ArgumentFactory,请参阅 https://github.com/brianm/jdbi/blob/master/src/test/java/org/skife/jdbi/v2/sqlobject/TestRegisterArgumentFactory.java举个例子。

第二个是,如果你只想在特定情况下这样做,创建一个自定义 Binder ,比如 http://jdbi.org/sql_object_api_argument_binding/

使用 ArgumentFactory 实现从 UUID 到字符串的全局绑定(bind)的示例:

UUIDArgumentFactory.java:

public class UUIDArgumentFactory implements ArgumentFactory<UUID> {

@Override
public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) {
return value instanceof UUID;
}

@Override
public Argument build(Class<?> expectedType, UUID value, StatementContext ctx) {
return new UUIDArgument(value);
}
}

UUIDArgument.java:

public class UUIDArgument implements Argument {
private final UUID value;

public UUIDArgument(UUID value) {
this.value = value;
}

@Override
public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
statement.setString(position, value.toString());
}
}

注册:

final DatabaseFactory factory = new DatabaseFactory(environment);
final Database db = factory.build(configuration.getDatabaseConfiguration(), "sqlserver");
db.registerArgumentFactory(new UUIDArgumentFactory());

关于java - JDBI 是否接受 UUID 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12022452/

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