Skip to content

Commit 49fbe84

Browse files
quaffbeikov
authored andcommitted
HHH-15618 Accept TypedParameterValue for procedure
1 parent 45c7fc5 commit 49fbe84

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.hibernate.engine.spi.SharedSessionContractImplementor;
3636
import org.hibernate.internal.CoreMessageLogger;
3737
import org.hibernate.internal.util.StringHelper;
38+
import org.hibernate.jpa.TypedParameterValue;
3839
import org.hibernate.persister.entity.EntityPersister;
3940
import org.hibernate.procedure.NoSuchParameterException;
4041
import org.hibernate.procedure.ParameterRegistration;
@@ -66,6 +67,7 @@
6667
* Standard implementation of {@link org.hibernate.procedure.ProcedureCall}
6768
*
6869
* @author Steve Ebersole
70+
* @author Yanming Zhou
6971
*/
7072
public class ProcedureCallImpl<R>
7173
extends AbstractProducedQuery<R>
@@ -814,13 +816,25 @@ public <P> ProcedureCallImplementor<R> setParameter(Parameter<P> parameter, P va
814816

815817
@Override
816818
public ProcedureCallImplementor<R> setParameter(String name, Object value) {
817-
paramBindings.getBinding( getParameterMetadata().getQueryParameter( name ) ).setBindValue( value );
819+
QueryParameterBinding<Object> binding = paramBindings.getBinding( getParameterMetadata().getQueryParameter( name ) );
820+
if ( value instanceof TypedParameterValue ) {
821+
binding.setBindValue( ( (TypedParameterValue) value ).getValue(), ( (TypedParameterValue) value ).getType() );
822+
}
823+
else {
824+
binding.setBindValue( value );
825+
}
818826
return this;
819827
}
820828

821829
@Override
822830
public ProcedureCallImplementor<R> setParameter(int position, Object value) {
823-
paramBindings.getBinding( getParameterMetadata().getQueryParameter( position ) ).setBindValue( value );
831+
QueryParameterBinding<Object> binding = paramBindings.getBinding( getParameterMetadata().getQueryParameter( position ) );
832+
if ( value instanceof TypedParameterValue ) {
833+
binding.setBindValue( ( (TypedParameterValue) value ).getValue(), ( (TypedParameterValue) value ).getType() );
834+
}
835+
else {
836+
binding.setBindValue( value );
837+
}
824838
return this;
825839
}
826840

hibernate-core/src/test/java/org/hibernate/test/procedure/StoredProcedureParameterTypeTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import javax.sql.rowset.serial.SerialBlob;
3030
import javax.sql.rowset.serial.SerialClob;
3131

32+
import org.hibernate.jpa.TypedParameterValue;
3233
import org.hibernate.procedure.ProcedureCall;
3334
import org.hibernate.type.BigDecimalType;
3435
import org.hibernate.type.BigIntegerType;
@@ -71,6 +72,7 @@
7172

7273
/**
7374
* @author Vlad Mihalcea
75+
* @author Yanming Zhou
7476
*/
7577
public class StoredProcedureParameterTypeTest extends BaseNonConfigCoreFunctionalTestCase {
7678

@@ -422,4 +424,49 @@ public void testStringTypeInParameterIsNullWithoutEnablePassingNulls() {
422424
}
423425
);
424426
}
427+
428+
@Test
429+
@TestForIssue(jiraKey = "HHH-15618")
430+
public void testTypedParameterValueInParameter() {
431+
inTransaction(
432+
session -> {
433+
ProcedureCall procedureCall = session.createStoredProcedureCall( "test" );
434+
procedureCall.registerParameter( 1, StringType.class, ParameterMode.IN );
435+
procedureCall.setParameter( 1, new TypedParameterValue( StringType.INSTANCE, "test" ) );
436+
437+
procedureCall = session.createStoredProcedureCall( "test" );
438+
procedureCall.registerParameter( "test", StringType.class, ParameterMode.IN );
439+
procedureCall.setParameter( "test", new TypedParameterValue( StringType.INSTANCE, "test" ) );
440+
}
441+
);
442+
}
443+
444+
@Test
445+
@TestForIssue(jiraKey = "HHH-15618")
446+
public void testTypedParameterValueInParameterWithEnablePassingNulls() {
447+
inTransaction(
448+
session -> {
449+
ProcedureCall procedureCall = session.createStoredProcedureCall( "test" );
450+
procedureCall.registerParameter( 1, StringType.class, ParameterMode.IN ).enablePassingNulls( true );
451+
procedureCall.setParameter( 1, new TypedParameterValue( StringType.INSTANCE, null ) );
452+
}
453+
);
454+
}
455+
456+
@Test
457+
@TestForIssue(jiraKey = "HHH-15618")
458+
public void testTypedParameterValueInParameterWithNotSpecifiedType() {
459+
inTransaction(
460+
session -> {
461+
try {
462+
ProcedureCall procedureCall = session.createStoredProcedureCall( "test" );
463+
procedureCall.registerParameter( 1, StringType.class, ParameterMode.IN );
464+
procedureCall.setParameter( 1, new TypedParameterValue( IntegerType.INSTANCE, 1 ) );
465+
}
466+
catch (IllegalArgumentException e) {
467+
assertTrue( e.getMessage().contains( "was not of specified type" ) );
468+
}
469+
}
470+
);
471+
}
425472
}

0 commit comments

Comments
 (0)