Skip to content

Commit 6fcbe5f

Browse files
committed
Fix parameter binding validation
1 parent 4d024fd commit 6fcbe5f

File tree

5 files changed

+323
-54
lines changed

5 files changed

+323
-54
lines changed

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

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,16 @@
2121
import org.hibernate.query.spi.QueryParameterBindings;
2222
import org.hibernate.query.spi.QueryParameterImplementor;
2323

24+
import org.jboss.logging.Logger;
25+
26+
import jakarta.persistence.ParameterMode;
27+
2428
/**
2529
* @author Steve Ebersole
2630
*/
2731
public class ProcedureParamBindings implements QueryParameterBindings {
32+
private static final Logger LOG = Logger.getLogger( QueryParameterBindings.class );
33+
2834
private final ProcedureParameterMetadataImpl parameterMetadata;
2935
private final SessionFactoryImplementor sessionFactory;
3036

@@ -91,19 +97,28 @@ public <P> ProcedureParameterBinding<P> getBinding(int position) {
9197

9298
@Override
9399
public void validate() {
94-
// parameterMetadata.visitRegistrations(
95-
// queryParameter -> {
96-
// final ProcedureParameterImplementor procParam = (ProcedureParameterImplementor) queryParameter;
97-
// if ( procParam.getMode() == ParameterMode.IN
98-
// || procParam.getMode() == ParameterMode.INOUT ) {
99-
// if ( !getBinding( procParam ).isBound() ) {
100-
// // depending on "pass nulls" this might be ok...
101-
// // for now, just log a warning
102-
// }
103-
// }
104-
// }
105-
// );
106-
throw new NotYetImplementedFor6Exception( getClass() );
100+
parameterMetadata.visitRegistrations(
101+
queryParameter -> {
102+
final ProcedureParameterImplementor procParam = (ProcedureParameterImplementor) queryParameter;
103+
if ( procParam.getMode() == ParameterMode.IN
104+
|| procParam.getMode() == ParameterMode.INOUT ) {
105+
if ( !getBinding( procParam ).isBound() ) {
106+
// depending on "pass nulls" this might be ok...
107+
// for now, just log a warning
108+
if ( procParam.getPosition() != null ) {
109+
LOG.debugf(
110+
"Procedure parameter at position %s is not bound",
111+
procParam.getPosition()
112+
);
113+
114+
}
115+
else {
116+
LOG.debugf( "Procedure parameter %s is not bound", procParam.getName() );
117+
}
118+
}
119+
}
120+
}
121+
);
107122
}
108123

109124
@Override

hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindingValidator.java

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ public void validate(
5252
}
5353

5454
final Class<?> parameterJavaType;
55+
final SqmExpressible<?> sqmExpressible = paramType.resolveExpressible( sessionFactory );
5556
if ( paramType.getBindableJavaType() != null ) {
5657
parameterJavaType = paramType.getBindableJavaType();
5758
}
5859
else {
59-
final SqmExpressible<?> sqmExpressible = paramType.resolveExpressible( sessionFactory );
6060
parameterJavaType = sqmExpressible.getBindableJavaType();
6161
}
6262

@@ -70,13 +70,26 @@ public void validate(
7070
// NOTE : this can happen in Hibernate's notion of "parameter list" binding
7171
// NOTE2 : the case of a collection value and an expected collection (if that can even happen)
7272
// will fall through to the main check.
73-
validateCollectionValuedParameterBinding( parameterJavaType, (Collection<?>) bind, temporalPrecision );
73+
validateCollectionValuedParameterBinding(
74+
parameterJavaType,
75+
(Collection<?>) bind,
76+
temporalPrecision
77+
);
7478
}
7579
else if ( bind.getClass().isArray() ) {
76-
validateArrayValuedParameterBinding( parameterJavaType, bind, temporalPrecision );
80+
validateArrayValuedParameterBinding(
81+
parameterJavaType,
82+
bind,
83+
temporalPrecision
84+
);
7785
}
7886
else {
79-
if ( !isValidBindValue( parameterJavaType, bind, temporalPrecision ) ) {
87+
if ( !isValidBindValue(
88+
sqmExpressible.getExpressibleJavaType(),
89+
parameterJavaType,
90+
bind,
91+
temporalPrecision
92+
) ) {
8093
throw new IllegalArgumentException(
8194
String.format(
8295
"Argument [%s] of type [%s] did not match parameter type [%s (%s)]",
@@ -113,7 +126,33 @@ private void validateCollectionValuedParameterBinding(
113126
}
114127
}
115128

116-
private static boolean isValidBindValue(Class<?> expectedType, Object value, TemporalType temporalType) {
129+
private static boolean isValidBindValue(
130+
JavaType<?> expectedJavaType,
131+
Class<?> expectedType,
132+
Object value,
133+
TemporalType temporalType) {
134+
if ( value == null ) {
135+
return true;
136+
}
137+
else if ( expectedJavaType.isInstance( value ) ) {
138+
return true;
139+
}
140+
else if ( temporalType != null ) {
141+
final boolean parameterDeclarationIsTemporal = Date.class.isAssignableFrom( expectedType )
142+
|| Calendar.class.isAssignableFrom( expectedType );
143+
final boolean bindIsTemporal = value instanceof Date
144+
|| value instanceof Calendar;
145+
146+
return parameterDeclarationIsTemporal && bindIsTemporal;
147+
}
148+
149+
return false;
150+
}
151+
152+
private static boolean isValidBindValue(
153+
Class<?> expectedType,
154+
Object value,
155+
TemporalType temporalType) {
117156
if ( expectedType.isPrimitive() ) {
118157
if ( expectedType == boolean.class ) {
119158
return value instanceof Boolean;

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/JdbcTimestampJavaType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ protected <X> TemporalJavaType<X> forTimestampPrecision(TypeConfiguration typeCo
205205
return (TemporalJavaType<X>) this;
206206
}
207207

208+
@Override
209+
protected <X> TemporalJavaType<X> forDatePrecision(TypeConfiguration typeConfiguration) {
210+
return (TemporalJavaType<X>) JdbcDateJavaType.INSTANCE;
211+
}
212+
208213
@Override
209214
public int getDefaultSqlPrecision(Dialect dialect, JdbcType jdbcType) {
210215
return dialect.getDefaultTimestampPrecision();

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/compliance/StoreProcedureTest.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)