@@ -79,7 +79,7 @@ public abstract class StatementCreatorUtils {
7979	public  static  final  String  IGNORE_GETPARAMETERTYPE_PROPERTY_NAME  = "spring.jdbc.getParameterType.ignore" ;
8080
8181
82- 	static  final  boolean  shouldIgnoreGetParameterType  =  SpringProperties . getFlag ( IGNORE_GETPARAMETERTYPE_PROPERTY_NAME ) ;
82+ 	static  final  Boolean  shouldIgnoreGetParameterType ;
8383
8484	static  final  Set <String > driversWithNoSupportForGetParameterType  =
8585			Collections .newSetFromMap (new  ConcurrentHashMap <String , Boolean >(1 ));
@@ -89,6 +89,9 @@ public abstract class StatementCreatorUtils {
8989	private  static  final  Map <Class <?>, Integer > javaTypeToSqlTypeMap  = new  HashMap <Class <?>, Integer >(32 );
9090
9191	static  {
92+ 		String  propVal  = SpringProperties .getProperty (IGNORE_GETPARAMETERTYPE_PROPERTY_NAME );
93+ 		shouldIgnoreGetParameterType  = (propVal  != null  ? Boolean .valueOf (propVal ) : null );
94+ 
9295		javaTypeToSqlTypeMap .put (boolean .class , Types .BOOLEAN );
9396		javaTypeToSqlTypeMap .put (Boolean .class , Types .BOOLEAN );
9497		javaTypeToSqlTypeMap .put (byte .class , Types .TINYINT );
@@ -246,18 +249,29 @@ private static void setNull(PreparedStatement ps, int paramIndex, int sqlType, S
246249			Integer  sqlTypeToUse  = null ;
247250			DatabaseMetaData  dbmd  = null ;
248251			String  jdbcDriverName  = null ;
249- 			boolean  checkGetParameterType  = !shouldIgnoreGetParameterType ;
250- 			if  (checkGetParameterType  && !driversWithNoSupportForGetParameterType .isEmpty ()) {
252+ 			boolean  tryGetParameterType  = true ;
253+ 
254+ 			if  (shouldIgnoreGetParameterType  == null ) {
251255				try  {
252256					dbmd  = ps .getConnection ().getMetaData ();
253257					jdbcDriverName  = dbmd .getDriverName ();
254- 					checkGetParameterType  = !driversWithNoSupportForGetParameterType .contains (jdbcDriverName );
258+ 					tryGetParameterType  = !driversWithNoSupportForGetParameterType .contains (jdbcDriverName );
259+ 					if  (tryGetParameterType  && jdbcDriverName .startsWith ("Oracle" )) {
260+ 						// Avoid getParameterType use with Oracle 12c driver by default: 
261+ 						// needs to be explicitly activated through spring.jdbc.getParameterType.ignore=false 
262+ 						tryGetParameterType  = false ;
263+ 						driversWithNoSupportForGetParameterType .add (jdbcDriverName );
264+ 					}
255265				}
256266				catch  (Throwable  ex ) {
257267					logger .debug ("Could not check connection metadata" , ex );
258268				}
259269			}
260- 			if  (checkGetParameterType ) {
270+ 			else  {
271+ 				tryGetParameterType  = !shouldIgnoreGetParameterType ;
272+ 			}
273+ 
274+ 			if  (tryGetParameterType ) {
261275				try  {
262276					sqlTypeToUse  = ps .getParameterMetaData ().getParameterType (paramIndex );
263277				}
@@ -267,6 +281,7 @@ private static void setNull(PreparedStatement ps, int paramIndex, int sqlType, S
267281					}
268282				}
269283			}
284+ 
270285			if  (sqlTypeToUse  == null ) {
271286				// JDBC driver not compliant with JDBC 3.0 -> proceed with database-specific checks 
272287				sqlTypeToUse  = Types .NULL ;
@@ -277,8 +292,7 @@ private static void setNull(PreparedStatement ps, int paramIndex, int sqlType, S
277292					if  (jdbcDriverName  == null ) {
278293						jdbcDriverName  = dbmd .getDriverName ();
279294					}
280- 					if  (checkGetParameterType  &&
281- 							!(jdbcDriverName .startsWith ("Oracle" ) && dbmd .getDriverMajorVersion () >= 12 )) {
295+ 					if  (shouldIgnoreGetParameterType  == null ) {
282296						// Register JDBC driver with no support for getParameterType, except for the 
283297						// Oracle 12c driver where getParameterType fails for specific statements only 
284298						// (so an exception thrown above does not indicate general lack of support). 
0 commit comments