@@ -38,6 +38,7 @@ public class ProviderSqlSource implements SqlSource {
38
38
private final Configuration configuration ;
39
39
private final Class <?> providerType ;
40
40
private final LanguageDriver languageDriver ;
41
+ private final Method mapperMethod ;
41
42
private Method providerMethod ;
42
43
private String [] providerMethodArgumentNames ;
43
44
private Class <?>[] providerMethodParameterTypes ;
@@ -59,6 +60,7 @@ public ProviderSqlSource(Configuration configuration, Object provider, Class<?>
59
60
String providerMethodName ;
60
61
try {
61
62
this .configuration = configuration ;
63
+ this .mapperMethod = mapperMethod ;
62
64
Lang lang = mapperMethod == null ? null : mapperMethod .getAnnotation (Lang .class );
63
65
this .languageDriver = configuration .getLanguageDriver (lang == null ? null : lang .value ());
64
66
this .providerType = getProviderType (provider , mapperMethod );
@@ -116,33 +118,45 @@ private SqlSource createSqlSource(Object parameterObject) {
116
118
try {
117
119
int bindParameterCount = providerMethodParameterTypes .length - (providerContext == null ? 0 : 1 );
118
120
String sql ;
119
- if (providerMethodParameterTypes .length == 0 ) {
121
+ if (parameterObject instanceof Map ) {
122
+ if (bindParameterCount == 1 && providerMethodParameterTypes [0 ] == Map .class ) {
123
+ sql = invokeProviderMethod (extractProviderMethodArguments (parameterObject ));
124
+ } else {
125
+ @ SuppressWarnings ("unchecked" )
126
+ Map <String , Object > params = (Map <String , Object >) parameterObject ;
127
+ sql = invokeProviderMethod (extractProviderMethodArguments (params , providerMethodArgumentNames ));
128
+ }
129
+ } else if (providerMethodParameterTypes .length == 0 ) {
120
130
sql = invokeProviderMethod ();
121
- } else if (bindParameterCount == 0 ) {
122
- sql = invokeProviderMethod (providerContext );
123
- } else if (bindParameterCount == 1
124
- && (parameterObject == null || providerMethodParameterTypes [providerContextIndex == null || providerContextIndex == 1 ? 0 : 1 ].isAssignableFrom (parameterObject .getClass ()))) {
131
+ } else if (providerMethodParameterTypes .length == 1 ) {
132
+ if (providerContext == null ) {
133
+ sql = invokeProviderMethod (parameterObject );
134
+ } else {
135
+ sql = invokeProviderMethod (providerContext );
136
+ }
137
+ } else if (providerMethodParameterTypes .length == 2 ) {
125
138
sql = invokeProviderMethod (extractProviderMethodArguments (parameterObject ));
126
- } else if (parameterObject instanceof Map ) {
127
- @ SuppressWarnings ("unchecked" )
128
- Map <String , Object > params = (Map <String , Object >) parameterObject ;
129
- sql = invokeProviderMethod (extractProviderMethodArguments (params , providerMethodArgumentNames ));
130
139
} else {
131
- throw new BuilderException ("Error invoking SqlProvider method ("
132
- + providerType .getName () + "." + providerMethod .getName ()
133
- + "). Cannot invoke a method that holds "
134
- + (bindParameterCount == 1 ? "named argument(@Param)" : "multiple arguments" )
135
- + " using a specifying parameterObject. In this case, please specify a 'java.util.Map' object." );
140
+ throw new BuilderException ("Cannot invoke SqlProvider method '" + providerMethod
141
+ + "' with specify parameter '" + (parameterObject == null ? null : parameterObject .getClass ())
142
+ + "' because SqlProvider method arguments for '" + mapperMethod + "' is an invalid combination." );
136
143
}
137
144
Class <?> parameterType = parameterObject == null ? Object .class : parameterObject .getClass ();
138
145
return languageDriver .createSqlSource (configuration , sql , parameterType );
139
146
} catch (BuilderException e ) {
140
147
throw e ;
141
148
} catch (Exception e ) {
142
- throw new BuilderException ("Error invoking SqlProvider method ("
143
- + providerType .getName () + "." + providerMethod .getName ()
144
- + "). Cause: " + e , e );
149
+ throw new BuilderException ("Error invoking SqlProvider method '" + providerMethod
150
+ + "' with specify parameter '" + (parameterObject == null ? null : parameterObject .getClass ()) + "'. Cause: " + extractRootCause (e ), e );
151
+ }
152
+ }
153
+
154
+ private Throwable extractRootCause (Exception e ) {
155
+ Throwable cause = e ;
156
+ while (cause .getCause () != null ) {
157
+ cause = e .getCause ();
145
158
}
159
+ return cause ;
146
160
}
147
161
148
162
private Object [] extractProviderMethodArguments (Object parameterObject ) {
0 commit comments