JDO 异常:“查询需要 1 个参数,但已提供 2 个值。”

Posted

技术标签:

【中文标题】JDO 异常:“查询需要 1 个参数,但已提供 2 个值。”【英文标题】:JDO Exception: "Query requires 1 parameters, yet 2 values have been provided." 【发布时间】:2011-04-14 02:55:35 【问题描述】:

尽管我的 JDO 查询包含 两个 declareParameters 语句,但下面的代码会产生一个错误,声称只接受一个参数

查询需要 1 个参数,但已提供 2 个值。

这两个参数分别是amountPtaxP

 javax.jdo.Query query= pm.newQuery(Main.class); 
 query.setFilter("amount == amountP && tax < taxP"); 
 query.declareParameters("int amountP"); 
 query.declareParameters("int taxP"); 
 List<Main> results = (List<Main>)query.execute (amountP, taxP); 

但是,通过以下更改,它可以工作。

 javax.jdo.Query query= pm.newQuery(Main.class); 
 query.setFilter("amount == amountP && tax < taxP"); 
 query.declareParameters("int amountP, int taxP"); 
 List<Main> results = (List<Main>)query.execute (amountP, taxP); 

我的问题是:原来的语法有什么问题?

更新:This problem has been reported by others 但没有解释。

【问题讨论】:

【参考方案1】:

JDO API 似乎要求一次设置所有参数。该方法称为declareParameters,它似乎是“setter”,而不是“adder”。方法名称可能会产生误导,文档也不是很好,但它似乎就是这样。

这与同时支持 setter 和 adder 的“扩展”不同:addExtension()setExtensions()

【讨论】:

【参考方案2】:

很明显,第二次调用 declareParameters 替换了第一次调用中声明的参数。第二个示例显示了声明多个参数的正确方法。

【讨论】:

+1 由于这种行为似乎暗示您的陈述是正确的。也许投反对票的人想解释他/她投反对票的原因?【参考方案3】:

取自官方文档的解释: link here

void declareParameters(java.lang.String parameters)
声明参数查询执行列表。参数 声明是一个包含一个或多个查询参数的字符串 声明用逗号分隔。中命名的每个参数 查询时参数声明必须绑定一个值 执行。

此方法的 String 参数遵循 Java 语言中形式参数的语法。

Parameters:参数 - 以逗号分隔的参数列表

【讨论】:

以上是关于JDO 异常:“查询需要 1 个参数,但已提供 2 个值。”的主要内容,如果未能解决你的问题,请参考以下文章

JDO

JDO - 更新对象

为啥要使用 Objectify 而不是 JDO?

JDO - 数据核 - HSQL 错误

在 JDO 中迁移字段

为啥 Google App Engine 文档强调 JDO 而不是 JPA?