当前位置: 首页 > 知识库问答 >
问题:

SimpleJDBCall类参数传递

穆旭尧
2023-03-14

我在MYSQL服务器上的y db中有一个存储过程。当我试图调用它时,它给出了错误:

通用域名格式。mysql。jdbc。例外。jdbc4。MySQLSyntaxErrorException:过程thu的参数数量不正确。生产者;预期为2,在组织中为0。springframework。jdbc。支持SQLExceptionSubclassTranslator。doTranslate(SQLExceptionSubclassTranslator.java:95)位于org。springframework。jdbc。支持AbstractFallbackSQLExceptionTranslator。在org上翻译(AbstractFallbackSQLExceptionTranslator.java:73)。springframework。jdbc。支持AbstractFallbackSQLExceptionTranslator。在org上翻译(AbstractFallbackSQLExceptionTranslator.java:81)。springframework。jdbc。果心jdbc模板。在org上执行(JdbcTemplate.java:1137)。springframework。jdbc。果心jdbc模板。请拨打org(JdbcTemplate.java:1173)。springframework。jdbc。果心易于理解的打电话。org上的ExecuteCallineral(AbstractJdbcCall.java:378)。springframework。jdbc。果心易于理解的打电话。doExecute(AbstractJdbcCall.java:363)

Java代码是:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate())
                                    .withSchemaName("thu")
                                    .withProcedureName("productGetter");

    jdbcCall.addDeclaredParameter(new SqlParameter("maxPrice", Types.DOUBLE));
    jdbcCall.addDeclaredParameter(new SqlParameter("minPrice", Types.DOUBLE));

    Map<String, Object> params=new HashMap<String, Object>();
    params.put("maxPrice", maxPrice);
    params.put("minPrice", minPrice);


    jdbcCall.execute(params);

存储过程db代码为:

CREATE DEFINER=`root`@`localhost` PROCEDURE `productGetter`(IN maxPrice double,minPrice double)
BEGIN
        ...    
END$$

我查了很多例子,找不到解决问题的方法。

有什么想法吗?

共有3个答案

谭昊乾
2023-03-14

您可以尝试使用MapSqlParamterSorce。

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate())
                                    .withSchemaName("thu")
                                    .withProcedureName("productGetter")
                                    .withoutProcedureColumnMetaDataAccess();

jdbcCall.addDeclaredParameter(new SqlParameter("maxPrice", Types.DOUBLE));
jdbcCall.addDeclaredParameter(new SqlParameter("minPrice", Types.DOUBLE));

MapSqlParameterSource source = new MapSqlParameterSource();
source.addValue("maxPrice", maxPrice);
source.addValue("minPrice", minPrice);

jdbcCall.execute(source);
何辰沛
2023-03-14

关于缺少参数,我也有同样的信息,但结果证明是架构名错了

哈栋
2023-03-14

从mysql 5.1连接器升级到6.0.6后,我遇到了同样的问题,解决的方法只是以这种方式添加:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate())
                                    .withSchemaName("thu")
                                    .withProcedureName("productGetter")
                                    .withoutProcedureColumnMetaDataAccess();

    jdbcCall.addDeclaredParameter(new SqlParameter("maxPrice", Types.DOUBLE));
    jdbcCall.addDeclaredParameter(new SqlParameter("minPrice", Types.DOUBLE));

    Map<String, Object> params=new HashMap<String, Object>();
    params.put("maxPrice", maxPrice);
    params.put("minPrice", minPrice);


    jdbcCall.execute(params);

 类似资料:
  • 有时对一个类的某些方面进行 参数化(parameterize)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。 操作步骤 声明参数作为如下类定义的一部分: class eventmachine( $version ) { package { "eventmachine": pro

  • 问题内容: 我有3类调用,和。 在我的课程中,我想要一个这样的方法: 因此,例如,我想: 如何将类名作为参数,并基于该类名从类名创建适当的对象? 问题答案: 使用反射是可能的。这里是给定的className(作为字符串传递)。此类将在内存中搜索(应该已经加载)。 作为字符串传递时要实例化的类的名称应 完全限定

  • 第3.2.3节中的x86_64 System V ABI指定了函数调用的哪些参数进入哪些寄存器,以及哪些被推送到堆栈上。我很难理解聚合分类的算法,它说(突出显示是我的): 聚合(结构和数组)和联合类型的分类工作如下: 如果一个对象的大小大于八个八字节,或者它包含未对齐的字段,则它具有类内存 如果C对象对于调用而言是非平凡的,如C ABI13中所指定,则通过不可见引用传递(该对象在参数列表中被具有类

  • 您可以将其他数据作为常规方法参数传递到后台任务。我再次使用下面的例子(希望没有让你厌恶): BackgroundJob.Enqueue(() => Console.WriteLine("Hello, {0}!", "world")); 在常规方法调用中,在执行后台作业期间, Console.WriteLine 方法将使用这些参数。为了参数传递进去,需要先序列化。 使用 了不起的 Newtonsof

  • 问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi

  • public static void main(String[]args){ 公共类CustomConfiguration{ public static void readConfig(String filename){//从config.properties文件读取 } 我的问题是如何将“a”传递给CustomConfiguration类?