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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?