15
15
*/
16
16
package org .springframework .data .jpa .repository .query ;
17
17
18
+ import static org .springframework .data .jpa .repository .query .QueryParameterSetter .ErrorHandling .LENIENT ;
19
+
18
20
import java .util .Date ;
19
21
import java .util .function .Function ;
20
22
23
25
import javax .persistence .TemporalType ;
24
26
import javax .persistence .criteria .ParameterExpression ;
25
27
28
+ import org .slf4j .Logger ;
29
+ import org .slf4j .LoggerFactory ;
26
30
import org .springframework .lang .Nullable ;
27
31
import org .springframework .util .Assert ;
28
32
36
40
*/
37
41
interface QueryParameterSetter {
38
42
39
- void setParameter (Query query , Object [] values );
43
+ void setParameter (Query query , Object [] values , ErrorHandling errorHandling );
40
44
41
45
/** Noop implementation */
42
- QueryParameterSetter NOOP = (query , values ) -> {};
46
+ QueryParameterSetter NOOP = (query , values , errorHandling ) -> {};
43
47
44
48
/**
45
49
* {@link QueryParameterSetter} for named or indexed parameters that might have a {@link TemporalType} specified.
@@ -70,7 +74,7 @@ class NamedOrIndexedQueryParameterSetter implements QueryParameterSetter {
70
74
* @see org.springframework.data.jpa.repository.query.QueryParameterSetter#setParameter(javax.persistence.Query, java.lang.Object[])
71
75
*/
72
76
@ SuppressWarnings ("unchecked" )
73
- public void setParameter (Query query , Object [] values ) {
77
+ public void setParameter (Query query , Object [] values , ErrorHandling errorHandling ) {
74
78
75
79
Object value = valueExtractor .apply (values );
76
80
@@ -82,24 +86,33 @@ public void setParameter(Query query, Object[] values) {
82
86
// fixed.
83
87
84
88
if (parameter instanceof ParameterExpression ) {
85
- query .setParameter ((Parameter <Date >) parameter , (Date ) value , temporalType );
89
+ errorHandling . execute (() -> query .setParameter ((Parameter <Date >) parameter , (Date ) value , temporalType ) );
86
90
} else if (parameter .getName () != null && QueryUtils .hasNamedParameter (query )) {
87
- query .setParameter (parameter .getName (), (Date ) value , temporalType );
91
+ errorHandling . execute (() -> query .setParameter (parameter .getName (), (Date ) value , temporalType ) );
88
92
} else {
89
- if (query .getParameters ().size () >= parameter .getPosition () || registerExcessParameters (query )) {
90
- query .setParameter (parameter .getPosition (), (Date ) value , temporalType );
93
+
94
+ Integer position = parameter .getPosition ();
95
+ if (position != null && (query .getParameters ().size () >= parameter .getPosition ()
96
+ || registerExcessParameters (query ) || errorHandling == LENIENT )) {
97
+
98
+ errorHandling .execute (() -> query .setParameter (parameter .getPosition (), (Date ) value , temporalType ));
91
99
}
92
100
}
93
101
94
102
} else {
95
103
96
104
if (parameter instanceof ParameterExpression ) {
97
- query .setParameter ((Parameter <Object >) parameter , value );
105
+ errorHandling . execute (() -> query .setParameter ((Parameter <Object >) parameter , value ) );
98
106
} else if (parameter .getName () != null && QueryUtils .hasNamedParameter (query )) {
99
- query .setParameter (parameter .getName (), value );
107
+ errorHandling .execute (() -> query .setParameter (parameter .getName (), value ));
108
+
100
109
} else {
101
- if (query .getParameters ().size () >= parameter .getPosition () || registerExcessParameters (query )) {
102
- query .setParameter (parameter .getPosition (), value );
110
+
111
+ Integer position = parameter .getPosition ();
112
+ if (position != null && (query .getParameters ().size () >= position || errorHandling == LENIENT
113
+ || registerExcessParameters (query ))) {
114
+
115
+ errorHandling .execute (() -> query .setParameter (position , value ));
103
116
}
104
117
}
105
118
}
@@ -117,4 +130,31 @@ private boolean registerExcessParameters(Query query) {
117
130
return query .getParameters ().size () == 0 && query .getClass ().getName ().startsWith ("org.eclipse" );
118
131
}
119
132
}
133
+
134
+ enum ErrorHandling {
135
+
136
+ STRICT {
137
+
138
+ @ Override
139
+ public void execute (Runnable block ) {
140
+ block .run ();
141
+ }
142
+ },
143
+
144
+ LENIENT {
145
+ @ Override
146
+ public void execute (Runnable block ) {
147
+
148
+ try {
149
+ block .run ();
150
+ } catch (RuntimeException rex ) {
151
+ LOG .info ("Silently ignoring" , rex );
152
+ }
153
+ }
154
+ };
155
+
156
+ private static final Logger LOG = LoggerFactory .getLogger (ErrorHandling .class );
157
+
158
+ abstract void execute (Runnable block );
159
+ }
120
160
}
0 commit comments