Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,9 @@ public <P> ProcedureParameterBinding<P> getQueryParamerBinding(ProcedureParamete
}

@Override
public <P> ProcedureParameterBinding<P> getBinding(String name) {
//noinspection unchecked
public ProcedureParameterBinding<?> getBinding(String name) {
final var parameter =
(ProcedureParameterImplementor<P>)
(ProcedureParameterImplementor<?>)
parameterMetadata.getQueryParameter( name );
if ( parameter == null ) {
throw new IllegalArgumentException( "Parameter does not exist: " + name );
Expand All @@ -83,10 +82,9 @@ public <P> ProcedureParameterBinding<P> getBinding(String name) {
}

@Override
public <P> ProcedureParameterBinding<P> getBinding(int position) {
//noinspection unchecked
public ProcedureParameterBinding<?> getBinding(int position) {
final var parameter =
(ProcedureParameterImplementor<P>)
(ProcedureParameterImplementor<?>)
parameterMetadata.getQueryParameter( position );
if ( parameter == null ) {
throw new IllegalArgumentException( "Parameter at position " + position + "does not exist" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,31 @@
*/
public class QueryArgumentException extends IllegalArgumentException {
private final Class<?> parameterType;
private final Class<?> argumentType;
private final Object argument;

public QueryArgumentException(String message, Class<?> parameterType, Object argument) {
super(message);
super( message + " (argument [" + argument + "] is not assignable to " + parameterType.getName() + ")" );
this.parameterType = parameterType;
this.argumentType = argument == null ? null : argument.getClass();
this.argument = argument;
}

public QueryArgumentException(String message, Class<?> parameterType, Class<?> argumentType, Object argument) {
super( message + " (" + argumentType.getName() + " is not assignable to " + parameterType.getName() + ")" );
this.parameterType = parameterType;
this.argumentType = argumentType;
this.argument = argument;
}

public Class<?> getParameterType() {
return parameterType;
}

public Class<?> getArgumentType() {
return argumentType;
}

public Object getArgument() {
return argument;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.query.internal;

import jakarta.persistence.metamodel.Type;
import org.hibernate.HibernateException;
import org.hibernate.type.BindingContext;
import org.hibernate.type.descriptor.WrapperOptions;

import java.util.Collection;

/**
* @since 7.3
*
* @author Gavin King
*/
public class QueryArguments {

public static boolean isInstance(
Type<?> parameterType, Object value,
BindingContext bindingContext, WrapperOptions options) {
if ( value == null ) {
return true;
}
final var sqmExpressible = bindingContext.resolveExpressible( parameterType );
assert sqmExpressible != null;
final var javaType = sqmExpressible.getExpressibleJavaType();
if ( !javaType.isInstance( value ) ) {
try {
// if this succeeds, we are good
javaType.wrap( value, options );
}
catch (HibernateException | UnsupportedOperationException e) {
return false;
}
}
return true;
}

public static boolean areInstances(
Type<?> parameterType, Collection<?> values,
BindingContext bindingContext, WrapperOptions options) {
if ( values.isEmpty() ) {
return true;
}
final var sqmExpressible = bindingContext.resolveExpressible( parameterType );
assert sqmExpressible != null;
final var javaType = sqmExpressible.getExpressibleJavaType();
for ( Object value : values ) {
if ( !javaType.isInstance( value ) ) {
try {
// if this succeeds, we are good
javaType.wrap( value, options );
}
catch (HibernateException | UnsupportedOperationException e) {
return false;
}
}
}
return true;
}

public static boolean areInstances(
Type<?> parameterType, Object[] values,
BindingContext bindingContext, WrapperOptions options) {
if ( values.length == 0 ) {
return true;
}
if ( parameterType.getJavaType().isAssignableFrom( values.getClass().getComponentType() ) ) {
return true;
}
final var sqmExpressible = bindingContext.resolveExpressible( parameterType );
assert sqmExpressible != null;
final var javaType = sqmExpressible.getExpressibleJavaType();
for ( Object value : values ) {
if ( !javaType.isInstance( value ) ) {
try {
// if this succeeds, we are good
javaType.wrap( value, options );
}
catch (HibernateException | UnsupportedOperationException e) {
return false;
}
}
}
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
import org.hibernate.query.QueryParameter;
import org.hibernate.query.spi.QueryParameterBinding;
import org.hibernate.query.spi.QueryParameterBindingTypeResolver;
import org.hibernate.query.spi.QueryParameterBindingValidator;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration;

import jakarta.persistence.TemporalType;

import static org.hibernate.query.spi.QueryParameterBindingValidator.validate;
import static org.hibernate.type.descriptor.java.JavaTypeHelper.isTemporal;
import static org.hibernate.type.internal.BindingTypeHelper.resolveTemporalPrecision;

Expand Down Expand Up @@ -116,7 +116,7 @@ public T getBindValue() {
public void setBindValue(T value, boolean resolveJdbcTypeIfNecessary) {
if ( !handleAsMultiValue( value, null ) ) {
final Object coerced = coerceIfNotJpa( value );
validate( coerced );
validate( getBindType(), coerced, sessionFactory );

if ( value == null ) {
// needed when setting a null value to the parameter of a native SQL query
Expand Down Expand Up @@ -174,7 +174,7 @@ public void setBindValue(T value, @Nullable BindableType<T> clarifiedType) {
}

final Object coerced = coerce( value );
validate( coerced, clarifiedType );
validate( clarifiedType, coerced, sessionFactory );
bindValue( coerced );
}
}
Expand All @@ -187,7 +187,7 @@ public void setBindValue(T value, TemporalType temporalTypePrecision) {
}

final Object coerced = coerceIfNotJpa( value );
validate( coerced, temporalTypePrecision );
validate( getBindType(), coerced, sessionFactory );
bindValue( coerced );
setExplicitTemporalPrecision( temporalTypePrecision );
}
Expand Down Expand Up @@ -284,18 +284,6 @@ else if ( type instanceof BasicValuedMapping basicValuedMapping ) {
return false;
}

private void validate(Object value) {
QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, getCriteriaBuilder() );
}

private void validate(Object value, BindableType<?> clarifiedType) {
QueryParameterBindingValidator.INSTANCE.validate( clarifiedType, value, getCriteriaBuilder() );
}

private void validate(Object value, TemporalType clarifiedTemporalType) {
QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, clarifiedTemporalType, getCriteriaBuilder() );
}

@Override
public TypeConfiguration getTypeConfiguration() {
return sessionFactory.getTypeConfiguration();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,30 +129,29 @@ public <P> QueryParameterBinding<P> getBinding(QueryParameterImplementor<P> para
"Cannot create binding for parameter reference [" + parameter + "] - reference is not a parameter of this query"
);
}
//TODO: typecheck!
//noinspection unchecked
return (QueryParameterBinding<P>) binding;
}

@Override
public <P> QueryParameterBinding<P> getBinding(int position) {
public QueryParameterBinding<?> getBinding(int position) {
final var binding = parameterBindingMapByNameOrPosition.get( position );
if ( binding == null ) {
// Invoke this method to throw the exception
parameterMetadata.getQueryParameter( position );
}
//noinspection unchecked
return (QueryParameterBinding<P>) binding;
return binding;
}

@Override
public <P> QueryParameterBinding<P> getBinding(String name) {
public QueryParameterBinding<?> getBinding(String name) {
final var binding = parameterBindingMapByNameOrPosition.get( name );
if ( binding == null ) {
// Invoke this method to throw the exception
parameterMetadata.getQueryParameter( name );
}
//noinspection unchecked
return (QueryParameterBinding<P>) binding;
return binding;
}

@Override
Expand Down
Loading
Loading