1
1
/*
2
- * Copyright 2002-2024 the original author or authors.
2
+ * Copyright 2002-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
49
49
* @author Juergen Hoeller
50
50
* @author Mark Paluch
51
51
* @author Anton Naydenov
52
+ * @author Sam Brannen
52
53
* @since 5.3
53
54
*/
54
55
abstract class NamedParameterUtils {
@@ -512,37 +513,75 @@ private static class ExpandedQuery implements PreparedOperation<String> {
512
513
513
514
private final BindParameterSource parameterSource ;
514
515
516
+
515
517
ExpandedQuery (String expandedSql , NamedParameters parameters , BindParameterSource parameterSource ) {
516
518
this .expandedSql = expandedSql ;
517
519
this .parameters = parameters ;
518
520
this .parameterSource = parameterSource ;
519
521
}
520
522
521
- @ SuppressWarnings ({"rawtypes" , "unchecked" })
522
- public void bind (BindTarget target , String identifier , Parameter parameter ) {
523
- List <BindMarker > bindMarkers = getBindMarkers (identifier );
523
+
524
+ @ Override
525
+ public String toQuery () {
526
+ return this .expandedSql ;
527
+ }
528
+
529
+ @ Override
530
+ public String getSource () {
531
+ return this .expandedSql ;
532
+ }
533
+
534
+ @ Override
535
+ public void bindTo (BindTarget target ) {
536
+ for (String namedParameter : this .parameterSource .getParameterNames ()) {
537
+ Parameter parameter = this .parameterSource .getValue (namedParameter );
538
+ if (parameter .getValue () == null ) {
539
+ bindNull (target , namedParameter , parameter );
540
+ }
541
+ else {
542
+ bind (target , namedParameter , parameter );
543
+ }
544
+ }
545
+ }
546
+
547
+ private void bindNull (BindTarget target , String identifier , Parameter parameter ) {
548
+ List <List <BindMarker >> bindMarkers = getBindMarkers (identifier );
549
+ if (bindMarkers == null ) {
550
+ target .bind (identifier , parameter );
551
+ return ;
552
+ }
553
+ for (List <BindMarker > outer : bindMarkers ) {
554
+ for (BindMarker bindMarker : outer ) {
555
+ bindMarker .bind (target , parameter );
556
+ }
557
+ }
558
+ }
559
+
560
+ private void bind (BindTarget target , String identifier , Parameter parameter ) {
561
+ List <List <BindMarker >> bindMarkers = getBindMarkers (identifier );
524
562
if (bindMarkers == null ) {
525
563
target .bind (identifier , parameter );
526
564
return ;
527
565
}
528
- if (parameter .getValue () instanceof Collection collection ) {
529
- Iterator <Object > iterator = collection .iterator ();
530
- Iterator <BindMarker > markers = bindMarkers .iterator ();
531
- while (iterator .hasNext ()) {
532
- Object valueToBind = iterator .next ();
533
- if (valueToBind instanceof Object [] objects ) {
534
- for (Object object : objects ) {
535
- bind (target , markers , object );
566
+
567
+ for (List <BindMarker > outer : bindMarkers ) {
568
+ if (parameter .getValue () instanceof Collection <?> collection ) {
569
+ Iterator <BindMarker > markers = outer .iterator ();
570
+ for (Object valueToBind : collection ) {
571
+ if (valueToBind instanceof Object [] objects ) {
572
+ for (Object object : objects ) {
573
+ bind (target , markers , object );
574
+ }
575
+ }
576
+ else {
577
+ bind (target , markers , valueToBind );
536
578
}
537
- }
538
- else {
539
- bind (target , markers , valueToBind );
540
579
}
541
580
}
542
- }
543
- else {
544
- for ( BindMarker bindMarker : bindMarkers ) {
545
- bindMarker . bind ( target , parameter );
581
+ else {
582
+ for ( BindMarker bindMarker : outer ) {
583
+ bindMarker . bind ( target , parameter );
584
+ }
546
585
}
547
586
}
548
587
}
@@ -554,51 +593,18 @@ private void bind(BindTarget target, Iterator<BindMarker> markers, Object valueT
554
593
markers .next ().bind (target , valueToBind );
555
594
}
556
595
557
- public void bindNull (BindTarget target , String identifier , Parameter parameter ) {
558
- List <BindMarker > bindMarkers = getBindMarkers (identifier );
559
- if (bindMarkers == null ) {
560
- target .bind (identifier , parameter );
561
- return ;
562
- }
563
- for (BindMarker bindMarker : bindMarkers ) {
564
- bindMarker .bind (target , parameter );
565
- }
566
- }
567
-
568
- @ Nullable List <BindMarker > getBindMarkers (String identifier ) {
596
+ private @ Nullable List <List <BindMarker >> getBindMarkers (String identifier ) {
569
597
List <NamedParameters .NamedParameter > parameters = this .parameters .getMarker (identifier );
570
598
if (parameters == null ) {
571
599
return null ;
572
600
}
573
- List <BindMarker > markers = new ArrayList <>();
601
+ List <List < BindMarker > > markers = new ArrayList <>();
574
602
for (NamedParameters .NamedParameter parameter : parameters ) {
575
- markers .addAll ( parameter .placeholders );
603
+ markers .add ( new ArrayList <>( parameter .placeholders ) );
576
604
}
577
605
return markers ;
578
606
}
579
607
580
- @ Override
581
- public String getSource () {
582
- return this .expandedSql ;
583
- }
584
-
585
- @ Override
586
- public void bindTo (BindTarget target ) {
587
- for (String namedParameter : this .parameterSource .getParameterNames ()) {
588
- Parameter parameter = this .parameterSource .getValue (namedParameter );
589
- if (parameter .getValue () == null ) {
590
- bindNull (target , namedParameter , parameter );
591
- }
592
- else {
593
- bind (target , namedParameter , parameter );
594
- }
595
- }
596
- }
597
-
598
- @ Override
599
- public String toQuery () {
600
- return this .expandedSql ;
601
- }
602
608
}
603
609
604
610
}
0 commit comments