0

私はこのようなマッパーメソッドを持っています:

@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問題をデバッグしたとき、のコンストラクターで、noの場合にこの例外がスローされることがわかりました。引数のは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私の場合は ) は、実際には 1つの引数、つまりすべての引数のマップ ラッパーを受け取ります。たとえば、引数が上記の質問 (セットと整数) の場合、parametersMap次のようにマップ ( と呼ばれる)からそれらにアクセスできます。

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

最初のパラメータは「0」で、2 番目のパラメータは「1」で、というようにキー付けされます。

IMHO、次のようなことができるように、引数はその名前でキー付けされている必要があります。

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

おそらくもっときれいだったでしょう。しかし、それがその実装方法です。

于 2012-12-26T09:43:00.323 に答える
1

複数の引数を指定するには、引数で @Param タグを使用します。

于 2015-02-16T11:42:41.103 に答える