Skip to content

Commit

Permalink
HHH-15618 Accept TypedParameterValue for procedure
Browse files Browse the repository at this point in the history
  • Loading branch information
quaff authored and beikov committed Dec 22, 2022
1 parent 45c7fc5 commit 49fbe84
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.procedure.NoSuchParameterException;
import org.hibernate.procedure.ParameterRegistration;
Expand Down Expand Up @@ -66,6 +67,7 @@
* Standard implementation of {@link org.hibernate.procedure.ProcedureCall}
*
* @author Steve Ebersole
* @author Yanming Zhou
*/
public class ProcedureCallImpl<R>
extends AbstractProducedQuery<R>
Expand Down Expand Up @@ -814,13 +816,25 @@ public <P> ProcedureCallImplementor<R> setParameter(Parameter<P> parameter, P va

@Override
public ProcedureCallImplementor<R> setParameter(String name, Object value) {
paramBindings.getBinding( getParameterMetadata().getQueryParameter( name ) ).setBindValue( value );
QueryParameterBinding<Object> binding = paramBindings.getBinding( getParameterMetadata().getQueryParameter( name ) );
if ( value instanceof TypedParameterValue ) {
binding.setBindValue( ( (TypedParameterValue) value ).getValue(), ( (TypedParameterValue) value ).getType() );
}
else {
binding.setBindValue( value );
}
return this;
}

@Override
public ProcedureCallImplementor<R> setParameter(int position, Object value) {
paramBindings.getBinding( getParameterMetadata().getQueryParameter( position ) ).setBindValue( value );
QueryParameterBinding<Object> binding = paramBindings.getBinding( getParameterMetadata().getQueryParameter( position ) );
if ( value instanceof TypedParameterValue ) {
binding.setBindValue( ( (TypedParameterValue) value ).getValue(), ( (TypedParameterValue) value ).getType() );
}
else {
binding.setBindValue( value );
}
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialClob;

import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.procedure.ProcedureCall;
import org.hibernate.type.BigDecimalType;
import org.hibernate.type.BigIntegerType;
Expand Down Expand Up @@ -71,6 +72,7 @@

/**
* @author Vlad Mihalcea
* @author Yanming Zhou
*/
public class StoredProcedureParameterTypeTest extends BaseNonConfigCoreFunctionalTestCase {

Expand Down Expand Up @@ -422,4 +424,49 @@ public void testStringTypeInParameterIsNullWithoutEnablePassingNulls() {
}
);
}

@Test
@TestForIssue(jiraKey = "HHH-15618")
public void testTypedParameterValueInParameter() {
inTransaction(
session -> {
ProcedureCall procedureCall = session.createStoredProcedureCall( "test" );
procedureCall.registerParameter( 1, StringType.class, ParameterMode.IN );
procedureCall.setParameter( 1, new TypedParameterValue( StringType.INSTANCE, "test" ) );

procedureCall = session.createStoredProcedureCall( "test" );
procedureCall.registerParameter( "test", StringType.class, ParameterMode.IN );
procedureCall.setParameter( "test", new TypedParameterValue( StringType.INSTANCE, "test" ) );
}
);
}

@Test
@TestForIssue(jiraKey = "HHH-15618")
public void testTypedParameterValueInParameterWithEnablePassingNulls() {
inTransaction(
session -> {
ProcedureCall procedureCall = session.createStoredProcedureCall( "test" );
procedureCall.registerParameter( 1, StringType.class, ParameterMode.IN ).enablePassingNulls( true );
procedureCall.setParameter( 1, new TypedParameterValue( StringType.INSTANCE, null ) );
}
);
}

@Test
@TestForIssue(jiraKey = "HHH-15618")
public void testTypedParameterValueInParameterWithNotSpecifiedType() {
inTransaction(
session -> {
try {
ProcedureCall procedureCall = session.createStoredProcedureCall( "test" );
procedureCall.registerParameter( 1, StringType.class, ParameterMode.IN );
procedureCall.setParameter( 1, new TypedParameterValue( IntegerType.INSTANCE, 1 ) );
}
catch (IllegalArgumentException e) {
assertTrue( e.getMessage().contains( "was not of specified type" ) );
}
}
);
}
}

0 comments on commit 49fbe84

Please sign in to comment.