JDBi3 UnableToCreateStatementException:没有为合格类型 org.jdbi.v3.core.argument.NullArgument 的“false”注册参数工厂

问题描述

我遇到了一个奇怪的问题,如果我尝试将 ("paramName",false) 绑定到我的数据库中的可为空的布尔值(sql 位),我会收到以下错误

org.jdbi.v3.core.statement.UnabletoCreateStatementException: No argument factory registered for 'false' of qualified type org.jdbi.v3.core.argument.NullArgument [statement:"UPDATE dbo.TagValues SET BoolValue = :boolValue,NumericValue = :numericValue,StringValue = :stringValue WHERE TagID = :tagID",arguments:{positional:{},named:{stringValue:NULL,tagID:17,numericValue:NULL,boolValue:false},finder:[]}]

我使用的是 MSsql Server 2017 和 jdbi 3。我的所有 3 个冒号描述的参数 boolValue、numericValue 和 stringValue 都可以为空。

奇怪的是,我对布尔值进行了硬编码,这是语句似乎出错的唯一实例。我附上了代码,带有违规行。提前为行长抱歉。

        PreparedBatch batch = handle.prepareBatch("UPDATE dbo.TagValues SET BoolValue = :boolValue,StringValue = :stringValue WHERE TagID = :tagID");

        active_sites.forEach(site -> site.getEntryPoints().forEach(entryPoint -> {
            if(entryPoint.isGatewayResponding() && !entryPoint.hasError()){
                entryPoint.getTiedTags().forEach(tag -> {
                    if (boolTypes.contains(tag.getType())) {
                        batch.bind("boolValue",tag.getValue().getValue()).bindNull("numericValue",Types.FLOAT).bindNull("stringValue",Types.VARCHAR).bind("tagID",tag.getIDX()).add();
                    }
                    else if (numericTypes.contains(tag.getType())) {
                        batch.bindNull("boolValue",Types.BIT).bind("numericValue",tag.getValue().getValue()).bindNull("stringValue",tag.getIDX()).add();
                    }
                    else if (stringTypes.contains(tag.getType())) {
                        batch.bindNull("boolValue",Types.BIT).bindNull("numericValue",Types.FLOAT).bind("stringValue",tag.getValue().getValue()).bind("tagID",tag.getIDX()).add();
                    }
                });
            }
            else {
                entryPoint.getTiedTags().forEach(tag -> batch.bindNull("boolValue",tag.getIDX()).add());
            }

            entryPoint.getErrorTags().stream().filter(tag -> tag.getType() == 33 || tag.getType() == 34 || tag.getType() == 35).forEach(tag -> {
                if(Objects.nonNull(tag.getValue())) {
                    batch.bind("boolValue",tag.getIDX()).add();
                }
                else {
                        //TAG 17 FALLS INTO THIS CATEGORY,CONFIRMED BY PRINTLN. THIS IS THE OFFENDER.
                        batch.bind("boolValue",false).bindNull("numericValue",tag.getIDX()).add();
                    }
                });
            }));

更新:

jdbi:3.18.1 mssql jdbc 驱动程序:9.2.1.jre15

完整的堆栈跟踪:

org.jdbi.v3.core.statement.UnabletoCreateStatementException: No argument factory registered for 'false' of qualified type org.jdbi.v3.core.argument.NullArgument [statement:"UPDATE dbo.TagValues SET BoolValue = :boolValue,finder:[]}]
    at org.jdbi.v3.core.statement.ArgumentBinder.factoryNotFound(ArgumentBinder.java:174)
    at org.jdbi.v3.core.statement.ArgumentBinder.lambda$null$2(ArgumentBinder.java:141)
    at java.base/java.util.Optional.orElseThrow(Optional.java:403)
    at org.jdbi.v3.core.statement.ArgumentBinder.lambda$null$3(ArgumentBinder.java:141)
    at org.jdbi.v3.core.statement.ArgumentBinder.lambda$null$4(ArgumentBinder.java:142)
    at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.lambda$prepareBinder$12(ArgumentBinder.java:230)
    at org.jdbi.v3.core.statement.ArgumentBinder.lambda$wrapExceptions$6(ArgumentBinder.java:153)
    at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.lambda$null$13(ArgumentBinder.java:234)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.lambda$prepareBinder$14(ArgumentBinder.java:234)
    at org.jdbi.v3.core.statement.ArgumentBinder$Prepared.bindNamed(ArgumentBinder.java:240)
    at org.jdbi.v3.core.statement.ArgumentBinder.bind(ArgumentBinder.java:60)
    at org.jdbi.v3.core.statement.PreparedBatch.internalBatchExecute(PreparedBatch.java:204)
    at org.jdbi.v3.core.statement.PreparedBatch.execute(PreparedBatch.java:108)
    at app.dao.services.impl.EntryDaoService.updateTagValues(EntryDaoService.java:165)
    at app.SCADA.updateTagValues(SCADA.java:215)
    at app.SCADA.run(SCADA.java:93)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:831)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)