Skip to content

Commit e43afc5

Browse files
committed
first phase of strict checking of arguments to query parameters
1 parent 9ce4619 commit e43afc5

File tree

10 files changed

+362
-148
lines changed

10 files changed

+362
-148
lines changed

hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParamBindings.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,21 @@ public <P> ProcedureParameterBinding<P> getQueryParameterBinding(ProcedureParame
7575
}
7676

7777
@Override
78-
public <P> ProcedureParameterBinding<P> getBinding(String name) {
78+
public ProcedureParameterBinding<?> getBinding(String name) {
7979
final var parameter = parameterMetadata.getQueryParameter( name );
8080
if ( parameter == null ) {
8181
throw new IllegalArgumentException( "Parameter with name '" + name + "' does not exist" );
8282
}
83-
//noinspection unchecked
84-
return getQueryParameterBinding( (ProcedureParameterImplementor<P>) parameter );
83+
return getQueryParameterBinding( (ProcedureParameterImplementor<?>) parameter );
8584
}
8685

8786
@Override
88-
public <P> ProcedureParameterBinding<P> getBinding(int position) {
87+
public ProcedureParameterBinding<?> getBinding(int position) {
8988
final var parameter = parameterMetadata.getQueryParameter( position );
9089
if ( parameter == null ) {
9190
throw new IllegalArgumentException( "Parameter at position " + position + "does not exist" );
9291
}
93-
//noinspection unchecked
94-
return getQueryParameterBinding( (ProcedureParameterImplementor<P>) parameter );
92+
return getQueryParameterBinding( (ProcedureParameterImplementor<?>) parameter );
9593
}
9694

9795
@Override
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query;
6+
7+
/**
8+
* Thrown when an argument bound to a query parameter is of an incompatible type.
9+
*
10+
* @since 7.2
11+
*
12+
* @author Gavin King
13+
*/
14+
public class QueryArgumentTypeException extends IllegalArgumentException {
15+
private final Class<?> expectedType;
16+
private final Class<?> actualType;
17+
18+
public QueryArgumentTypeException(String message, Class<?> expectedType, Class<?> actualType) {
19+
super( message + " (" + actualType.getName() + " is not assignable to " + expectedType.getName() + ")" );
20+
this.expectedType = expectedType;
21+
this.actualType = actualType;
22+
}
23+
24+
public Class<?> getExpectedType() {
25+
return expectedType;
26+
}
27+
28+
public Class<?> getActualType() {
29+
return actualType;
30+
}
31+
}

hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,30 +129,29 @@ public <P> QueryParameterBinding<P> getBinding(QueryParameterImplementor<P> para
129129
"Cannot create binding for parameter reference [" + parameter + "] - reference is not a parameter of this query"
130130
);
131131
}
132+
//TODO: typecheck!
132133
//noinspection unchecked
133134
return (QueryParameterBinding<P>) binding;
134135
}
135136

136137
@Override
137-
public <P> QueryParameterBinding<P> getBinding(int position) {
138+
public QueryParameterBinding<?> getBinding(int position) {
138139
final var binding = parameterBindingMapByNameOrPosition.get( position );
139140
if ( binding == null ) {
140141
// Invoke this method to throw the exception
141142
parameterMetadata.getQueryParameter( position );
142143
}
143-
//noinspection unchecked
144-
return (QueryParameterBinding<P>) binding;
144+
return binding;
145145
}
146146

147147
@Override
148-
public <P> QueryParameterBinding<P> getBinding(String name) {
148+
public QueryParameterBinding<?> getBinding(String name) {
149149
final var binding = parameterBindingMapByNameOrPosition.get( name );
150150
if ( binding == null ) {
151151
// Invoke this method to throw the exception
152152
parameterMetadata.getQueryParameter( name );
153153
}
154-
//noinspection unchecked
155-
return (QueryParameterBinding<P>) binding;
154+
return binding;
156155
}
157156

158157
@Override

0 commit comments

Comments
 (0)