jdbi3 unabletocreatestatementexception:没有为限定类型org.jdbi.v3.core.argument.nullargument的“false”注册参数工厂

zsbz8rwp  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(207)

我遇到了一个奇怪的问题,如果我尝试将(“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, NumericValue = :numericValue, 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", Types.VARCHAR).bind("tagID", 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", Types.BIT).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", 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.getValue().getValue()).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", tag.getIDX()).add();
                }
                else {
                        //TAG 17 FALLS INTO THIS CATEGORY, CONFIRMED BY PRINTLN. THIS IS THE OFFENDER.
                        batch.bind("boolValue", false).bindNull("numericValue", Types.FLOAT).bindNull("stringValue", Types.VARCHAR).bind("tagID", 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, NumericValue = :numericValue, StringValue = :stringValue WHERE TagID = :tagID", arguments:{positional:{}, named:{stringValue:NULL,tagID:17,numericValue:NULL,boolValue:false}, 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)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题