2012-12-20 61 views
0

我有一個映射器的方法是這樣的:在SelectProvider中,MyBatis不允許多於一個參數嗎?

@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 
} 

它給了我一個錯誤:

錯誤創建SqlSource爲SqlProvider。法「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() + "'."); 
    } 
    } 

回答

1

事實證明,我們可以通過在與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") 

它可能已經比較乾淨。但這是如何實施的。

0

爲了提供多個參數,在參數中使用@Param標籤。