0

我有一个像这样的映射器方法:

@InsertProvider(class=com.something.class, method="doSomething")
public void insertSomething(Set<Integer> set, int guideId);

在 something 类中,我有一个方法:

public String doSomething(Set<Integer> set, int guideId){
  // do something and returna a query
}

它给了我一个错误:

为 SqlProvider 创建 SqlSource 时出错。在 SqlProvider 'com.something.class' 中找不到方法 'doSomething'

当我调试问题时..我发现在的构造函数中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() + "'.");
    }
  }
4

2 回答 2

3

事实证明,我们可以在用SelectProvider(或任何其他提供者)注解的方法中传递任意数量的参数。但是实际提供查询的方法(doSomething在我的例子中)实际上将接收一个参数,即所有参数的映射包装器。例如,如果参数如上述问题(一个集合和一个整数),我们可以从映射(称为parametersMap)访问它们,如下所示:

Set<Integer> nums = (Set<Integer>) parametersMap.get("0"); 
int groupId = (Integer) parametersMap.get("1");

第一个参数键入“0”,第二个参数键入“1”,依此类推。

恕我直言,参数应该用它们的名字作为键,这样我们就可以做类似的事情:

parametersMap.get("set");
parametersMap.get("guideId")

它可能会更干净。但这就是它的实现方式。

于 2012-12-26T09:43:00.323 回答
1

要提供多个参数,请在参数中使用 @Param 标记。

于 2015-02-16T11:42:41.103 回答