Skip to content

Commit 934eebe

Browse files
authored
Merge pull request #1606 from kazuki43zoo/gh-1604-fix-broken-backward-compatibility
Fix broken backward compatibility by gh-1604
2 parents 0a9f940 + 1eb11b8 commit 934eebe

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,11 @@ public BoundSql getBoundSql(Object parameterObject) {
116116

117117
private SqlSource createSqlSource(Object parameterObject) {
118118
try {
119-
int bindParameterCount = providerMethodParameterTypes.length - (providerContext == null ? 0 : 1);
120119
String sql;
121120
if (parameterObject instanceof Map) {
122-
if (bindParameterCount == 1 && providerMethodParameterTypes[0] == Map.class) {
121+
int bindParameterCount = providerMethodParameterTypes.length - (providerContext == null ? 0 : 1);
122+
if (bindParameterCount == 1 &&
123+
(providerMethodParameterTypes[Integer.valueOf(0).equals(providerContextIndex) ? 1 : 0].isAssignableFrom(parameterObject.getClass()))) {
123124
sql = invokeProviderMethod(extractProviderMethodArguments(parameterObject));
124125
} else {
125126
@SuppressWarnings("unchecked")

src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java

+50
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.io.Reader;
2525
import java.lang.reflect.Method;
2626
import java.util.ArrayList;
27+
import java.util.Collections;
2728
import java.util.HashMap;
2829
import java.util.List;
2930
import java.util.Map;
@@ -32,6 +33,7 @@
3233
import org.apache.ibatis.annotations.DeleteProvider;
3334
import org.apache.ibatis.annotations.Param;
3435
import org.apache.ibatis.annotations.SelectProvider;
36+
import org.apache.ibatis.binding.MapperMethod;
3537
import org.apache.ibatis.builder.BuilderException;
3638
import org.apache.ibatis.builder.annotation.ProviderContext;
3739
import org.apache.ibatis.builder.annotation.ProviderSqlSource;
@@ -619,6 +621,33 @@ void staticMethodOneArgumentAndProviderContext() {
619621
}
620622
}
621623

624+
@Test
625+
void mapAndProviderContext() {
626+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
627+
StaticMethodSqlProviderMapper mapper =
628+
sqlSession.getMapper(StaticMethodSqlProviderMapper.class);
629+
assertEquals("mybatis", mapper.mapAndProviderContext("mybatis"));
630+
}
631+
}
632+
633+
@Test
634+
void multipleMap() {
635+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
636+
StaticMethodSqlProviderMapper mapper =
637+
sqlSession.getMapper(StaticMethodSqlProviderMapper.class);
638+
assertEquals("123456", mapper.multipleMap(Collections.singletonMap("value", "123"), Collections.singletonMap("value", "456")));
639+
}
640+
}
641+
642+
@Test
643+
void providerContextAndMap() {
644+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
645+
StaticMethodSqlProviderMapper mapper =
646+
sqlSession.getMapper(StaticMethodSqlProviderMapper.class);
647+
assertEquals("mybatis", mapper.providerContextAndParamMap("mybatis"));
648+
}
649+
}
650+
622651
public interface ErrorMapper {
623652
@SelectProvider(type = ErrorSqlBuilder.class, method = "methodNotFound")
624653
void methodNotFound();
@@ -716,6 +745,15 @@ public interface StaticMethodSqlProviderMapper {
716745
@SelectProvider(type = SqlProvider.class, method = "oneArgumentAndProviderContext")
717746
String oneArgumentAndProviderContext(Integer value);
718747

748+
@SelectProvider(type = SqlProvider.class, method = "mapAndProviderContext")
749+
String mapAndProviderContext(@Param("value") String value);
750+
751+
@SelectProvider(type = SqlProvider.class, method = "providerContextAndParamMap")
752+
String providerContextAndParamMap(@Param("value") String value);
753+
754+
@SelectProvider(type = SqlProvider.class, method = "multipleMap")
755+
String multipleMap(@Param("map1") Map<String, Object> map1, @Param("map2") Map<String, Object> map2);
756+
719757
@SuppressWarnings("unused")
720758
class SqlProvider {
721759

@@ -793,6 +831,18 @@ public static String oneArgumentAndProviderContext(Integer value, ProviderContex
793831
+ "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
794832
}
795833

834+
public static String mapAndProviderContext(Map<String, Object> map, ProviderContext context) {
835+
return "SELECT '" + map.get("value") + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
836+
}
837+
838+
public static String providerContextAndParamMap(ProviderContext context, MapperMethod.ParamMap<Object> map) {
839+
return "SELECT '" + map.get("value") + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
840+
}
841+
842+
public static String multipleMap(@Param("map1") Map<String, Object> map1, @Param("map2") Map<String, Object> map2) {
843+
return "SELECT '" + map1.get("value") + map2.get("value") + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS";
844+
}
845+
796846
}
797847

798848
}

0 commit comments

Comments
 (0)