我有一个这样的mapper方法:
@InsertProvider(class=com.something.class, method="doSomething")
public void insertSomething(Set<Integer> set, int guideId);
在某个类中,我有一个方法:
public String doSomething(Set<Integer> set, int guideId){
// do something and returna a query
}
它给了我一个错误:
为SqlProvider创建SqlSource时出错。方法'doSomething'不是 在SqlProvider中找到'com.something.class'
当我调试问题时..我发现在ProviderSqlResource
的构造函数中,如果没有,它会抛出此异常。参数是2 or more
。我想不出他们为什么会这样做的任何理由。什么是解决方法?
以下是方法:
public ProviderSqlSource(Configuration config, Object provider) {
String providerMethodName = null;
try {
this.sqlSourceParser = new SqlSourceBuilder(config);
this.providerType = (Class<?>) provider.getClass().getMethod("type").invoke(provider);
providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider);
for (Method m : this.providerType.getMethods()) {
if (providerMethodName.equals(m.getName())) {
if (m.getParameterTypes().length < 2
&& m.getReturnType() == String.class) {
this.providerMethod = m;
this.providerTakesParameterObject = m.getParameterTypes().length == 1;
}
}
}
} catch (Exception e) {
throw new BuilderException("Error creating SqlSource for SqlProvider. Cause: " + e, e);
}
if (this.providerMethod == null) {
throw new BuilderException("Error creating SqlSource for SqlProvider. Method '"
+ providerMethodName + "' not found in SqlProvider '" + this.providerType.getName() + "'.");
}
}
答案 0 :(得分:2)
事实证明,我们可以在使用SelectProvider
(或任何其他提供者)注释的方法中传递任意数量的参数。但实际提供查询的方法(在我的例子中为doSomething
)实际上会收到一个单个参数,即围绕所有参数的地图包装。例如,如果参数与上面的问题(集合和整数)相同,我们可以从地图(称为parametersMap
)访问它们,如下所示:
Set<Integer> nums = (Set<Integer>) parametersMap.get("0");
int groupId = (Integer) parametersMap.get("1");
第一个参数用&#34; 0&#34;键入第二个是&#34; 1&#34;等等。
恕我直言,这些论点应该与他们的名字联系起来,这样我们就能做出类似的事情:parametersMap.get("set");
parametersMap.get("guideId")
它可能会更干净。但那就是它的实施方式。
答案 1 :(得分:0)
要提供多个参数,请在参数中使用@Param标记。