gpt4 book ai didi

java - JDBC DatabaseMetaData 说我的 mysql 服务器不支持 namedParameters 并因此抛出空指针异常

转载 作者:行者123 更新时间:2023-11-30 22:13:44 24 4
gpt4 key购买 nike

我最近又回到了 java 上,我正在努力使以下方法起作用:

@Override
public T createEntity(T entity) throws SQLException{
DatabaseMetaData dbMeta = connection.getMetaData();
boolean okay = dbMeta.supportsNamedParameters();
if(okay) {
System.out.println("Supports named arguments");
} else {
System.out.println("Does not support named arguments");
}
CallableStatement cstmt = connection.prepareCall("create_" + table.getName() + "(" + columns.stream().map( column -> "?").collect(Collectors.joining(",")) + ")");

final ThrowingConsumer<DatabaseColumn> throwingConsumer = column -> {
try {
String alright = "herpderp";
cstmt.setObject(column.getName(), entity.getClass().getDeclaredField(column.getName()).get(entity) /**, SQLType targetSqlType ?? */ );
ParameterMetaData meta = cstmt.getParameterMetaData();
} catch(Exception e) {
e.printStackTrace();
}
};
columns.stream().forEach(throwingConsumer);

cstmt.execute();
return null;
}

电话:

cstmt.setObject(column.getName(), entity.getClass().getDeclaredField(column.getName()).get(entity) /**, SQLType targetSqlType ?? */ );

因空指针异常而失败,我已经检查过两个值都很好,但最终它只是一个空指针。准备好的声明看起来也很好。我正在尝试使用 namedParameters,所以我认为这是罪魁祸首,我试图检查我的设置是否与 namedParameters 兼容,结果证明 DatabaseMetaData 在以下代码中并不这么认为:

DatabaseMetaData dbMeta  = connection.getMetaData();
boolean okay = dbMeta.supportsNamedParameters();
if(okay) {
System.out.println("Supports named arguments");
} else {
System.out.println("Does not support named arguments");
}

.以下是我的版本:

    compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.3'

mysql: mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

几乎是最新的。

如果我用调试器运行它,给出空指针的场景如下所示:

cstmt.setObject("email", "herpderp@gmail.com");

callableStatement 中的 orginalSql 字段如下所示:

create_account(?, ?, ?, ?, ?)

存储过程如下所示:

CREATE DEFINER=`root`@`localhost` PROCEDURE `create_account`(email VARCHAR(45), username VARCHAR (45), pw VARCHAR (45), guid VARCHAR(45), verified tinyint(4))
BEGIN
insert into account (`email`, `username`, `password`, `guid`, `verified`) values (email, username, pw, guid, verified);
END

谢谢

最佳答案

调用存储过程时,是这样的:

 CallableStatement cstmt = connection.prepareCall("{CALL create_" + table.getName() + "(" + columns.stream().map( column -> "?").collect(Collectors.joining(","))  + ")}");

如果没有 CALL,它就没有用,我希望错误信息能更有帮助,显然是个彻头彻尾的傻瓜 :)

关于java - JDBC DatabaseMetaData 说我的 mysql 服务器不支持 namedParameters 并因此抛出空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184696/

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