6161import org .hibernate .jpa .internal .util .LockModeTypeHelper ;
6262import org .hibernate .jpa .spi .AbstractEntityManagerImpl ;
6363import org .hibernate .jpa .spi .AbstractQueryImpl ;
64+ import org .hibernate .jpa .spi .ParameterBind ;
65+ import org .hibernate .jpa .spi .ParameterRegistration ;
6466import org .hibernate .type .CompositeCustomType ;
6567import org .hibernate .type .Type ;
6668import org .jboss .logging .Logger ;
@@ -112,7 +114,7 @@ private void extractParameterInfo(Map<String,Class> namedParameterTypeRedefiniti
112114 else if ( descriptor .getExpectedType () != null ) {
113115 javaType = descriptor .getExpectedType ().getReturnedClass ();
114116 }
115- registerParameter ( new ParameterRegistrationImpl ( query , name , javaType ) );
117+ registerParameter ( new ParameterRegistrationImpl ( this , query , name , javaType ) );
116118 if ( descriptor .isJpaStyle () ) {
117119 if ( jpaPositionalIndices == null ) {
118120 jpaPositionalIndices = new HashSet <Integer >();
@@ -125,7 +127,7 @@ else if ( descriptor.getExpectedType() != null ) {
125127 for ( int i = 0 , max = parameterMetadata .getOrdinalParameterCount (); i < max ; i ++ ) {
126128 final OrdinalParameterDescriptor descriptor = parameterMetadata .getOrdinalParameterDescriptor ( i + 1 );
127129 Class javaType = descriptor .getExpectedType () == null ? null : descriptor .getExpectedType ().getReturnedClass ();
128- registerParameter ( new ParameterRegistrationImpl ( query , i +1 , javaType ) );
130+ registerParameter ( new ParameterRegistrationImpl ( this , query , i +1 , javaType ) );
129131 Integer position = descriptor .getOrdinalPosition ();
130132 if ( jpaPositionalIndices != null && jpaPositionalIndices .contains (position ) ) {
131133 LOG .parameterPositionOccurredAsBothJpaAndHibernatePositionalParameter (position );
@@ -147,28 +149,44 @@ private boolean mightNeedRedefinition(Class javaType, Type expectedType) {
147149 }
148150
149151 private static class ParameterRegistrationImpl <T > implements ParameterRegistration <T > {
150- private final org .hibernate .Query query ;
152+ private final Query jpaQuery ;
153+ private final org .hibernate .Query nativeQuery ;
151154
152155 private final String name ;
153156 private final Integer position ;
154157 private final Class <T > javaType ;
155158
156159 private ParameterBind <T > bind ;
157160
158- private ParameterRegistrationImpl (org .hibernate .Query query , String name , Class <T > javaType ) {
159- this .query = query ;
161+ private ParameterRegistrationImpl (
162+ Query jpaQuery ,
163+ org .hibernate .Query nativeQuery ,
164+ String name ,
165+ Class <T > javaType ) {
166+ this .jpaQuery = jpaQuery ;
167+ this .nativeQuery = nativeQuery ;
160168 this .name = name ;
161169 this .javaType = javaType ;
162170 this .position = null ;
163171 }
164172
165- private ParameterRegistrationImpl (org .hibernate .Query query , Integer position , Class <T > javaType ) {
166- this .query = query ;
173+ private ParameterRegistrationImpl (
174+ Query jpaQuery ,
175+ org .hibernate .Query nativeQuery ,
176+ Integer position ,
177+ Class <T > javaType ) {
178+ this .jpaQuery = jpaQuery ;
179+ this .nativeQuery = nativeQuery ;
167180 this .position = position ;
168181 this .javaType = javaType ;
169182 this .name = null ;
170183 }
171184
185+ @ Override
186+ public Query getQuery () {
187+ return jpaQuery ;
188+ }
189+
172190 @ Override
173191 public String getName () {
174192 return name ;
@@ -202,14 +220,14 @@ public void bindValue(T value) {
202220
203221 if ( name != null ) {
204222 if ( value instanceof Collection ) {
205- query .setParameterList ( name , (Collection ) value );
223+ nativeQuery .setParameterList ( name , (Collection ) value );
206224 }
207225 else {
208- query .setParameter ( name , value );
226+ nativeQuery .setParameter ( name , value );
209227 }
210228 }
211229 else {
212- query .setParameter ( position - 1 , value );
230+ nativeQuery .setParameter ( position - 1 , value );
213231 }
214232
215233 bind = new ParameterBindImpl <T >( value , null );
@@ -222,48 +240,48 @@ public void bindValue(T value, TemporalType specifiedTemporalType) {
222240 if ( Date .class .isInstance ( value ) ) {
223241 if ( name != null ) {
224242 if ( specifiedTemporalType == DATE ) {
225- query .setDate ( name , (Date ) value );
243+ nativeQuery .setDate ( name , (Date ) value );
226244 }
227245 else if ( specifiedTemporalType == TIME ) {
228- query .setTime ( name , (Date ) value );
246+ nativeQuery .setTime ( name , (Date ) value );
229247 }
230248 else if ( specifiedTemporalType == TIMESTAMP ) {
231- query .setTimestamp ( name , (Date ) value );
249+ nativeQuery .setTimestamp ( name , (Date ) value );
232250 }
233251 }
234252 else {
235253 if ( specifiedTemporalType == DATE ) {
236- query .setDate ( position - 1 , (Date ) value );
254+ nativeQuery .setDate ( position - 1 , (Date ) value );
237255 }
238256 else if ( specifiedTemporalType == TIME ) {
239- query .setTime ( position - 1 , (Date ) value );
257+ nativeQuery .setTime ( position - 1 , (Date ) value );
240258 }
241259 else if ( specifiedTemporalType == TIMESTAMP ) {
242- query .setTimestamp ( position - 1 , (Date ) value );
260+ nativeQuery .setTimestamp ( position - 1 , (Date ) value );
243261 }
244262 }
245263 }
246264 else if ( Calendar .class .isInstance ( value ) ) {
247265 if ( name != null ) {
248266 if ( specifiedTemporalType == DATE ) {
249- query .setCalendarDate ( name , (Calendar ) value );
267+ nativeQuery .setCalendarDate ( name , (Calendar ) value );
250268 }
251269 else if ( specifiedTemporalType == TIME ) {
252270 throw new IllegalArgumentException ( "not yet implemented" );
253271 }
254272 else if ( specifiedTemporalType == TIMESTAMP ) {
255- query .setCalendar ( name , (Calendar ) value );
273+ nativeQuery .setCalendar ( name , (Calendar ) value );
256274 }
257275 }
258276 else {
259277 if ( specifiedTemporalType == DATE ) {
260- query .setCalendarDate ( position - 1 , (Calendar ) value );
278+ nativeQuery .setCalendarDate ( position - 1 , (Calendar ) value );
261279 }
262280 else if ( specifiedTemporalType == TIME ) {
263281 throw new IllegalArgumentException ( "not yet implemented" );
264282 }
265283 else if ( specifiedTemporalType == TIMESTAMP ) {
266- query .setCalendar ( position - 1 , (Calendar ) value );
284+ nativeQuery .setCalendar ( position - 1 , (Calendar ) value );
267285 }
268286 }
269287 }
0 commit comments