8989import static org .hibernate .jpa .internal .util .ConfigurationHelper .getCacheMode ;
9090import static org .hibernate .jpa .internal .util .ConfigurationHelper .getInteger ;
9191import static org .hibernate .query .QueryLogging .QUERY_MESSAGE_LOGGER ;
92+ import static org .hibernate .query .internal .QueryArguments .areInstances ;
93+ import static org .hibernate .query .internal .QueryArguments .isInstance ;
9294
9395/**
9496 * Base implementation of {@link CommonQueryContract}.
@@ -755,7 +757,7 @@ protected <P> QueryParameterBinding<P> locateBinding(String name, Class<P> javaT
755757 if ( parameterType != null ) {
756758 final var parameterJavaType = parameterType .getJavaType ();
757759 if ( !parameterJavaType .isAssignableFrom ( javaType )
758- && !isInstance ( parameterType , value ) ) {
760+ && !isInstance ( parameterType , value , getNodeBuilder (), getSession () ) ) {
759761 throw new QueryArgumentException (
760762 "Argument to parameter named '" + name + "' has an incompatible type" ,
761763 parameterJavaType , javaType , value );
@@ -773,7 +775,7 @@ protected <P> QueryParameterBinding<P> locateBinding(int position, Class<P> java
773775 if ( parameterType != null ) {
774776 final var parameterJavaType = parameterType .getJavaType ();
775777 if ( !parameterJavaType .isAssignableFrom ( javaType )
776- && !isInstance ( parameterType , value ) ) {
778+ && !isInstance ( parameterType , value , getNodeBuilder (), getSession () ) ) {
777779 throw new QueryArgumentException (
778780 "Argument to parameter at position " + position + " has an incompatible type" ,
779781 parameterJavaType , javaType , value );
@@ -791,7 +793,7 @@ protected <P> QueryParameterBinding<P> locateBinding(String name, Class<P> javaT
791793 if ( parameterType != null ) {
792794 final var parameterJavaType = parameterType .getJavaType ();
793795 if ( !parameterJavaType .isAssignableFrom ( javaType )
794- && !areInstances ( parameterType , values ) ) {
796+ && !areInstances ( parameterType , values , getNodeBuilder (), getSession () ) ) {
795797 throw new QueryArgumentException (
796798 "Argument to parameter named '" + name + "' has an incompatible type" ,
797799 parameterJavaType , javaType , values );
@@ -809,7 +811,7 @@ protected <P> QueryParameterBinding<P> locateBinding(int position, Class<P> java
809811 if ( parameterType != null ) {
810812 final var parameterJavaType = parameterType .getJavaType ();
811813 if ( !parameterJavaType .isAssignableFrom ( javaType )
812- && !areInstances ( parameterType , values ) ) {
814+ && !areInstances ( parameterType , values , getNodeBuilder (), getSession () ) ) {
813815 throw new QueryArgumentException (
814816 "Argument to parameter at position " + position + " has an incompatible type" ,
815817 parameterJavaType , javaType , values );
@@ -886,8 +888,8 @@ private <P> void setParameterValue(Object value, QueryParameterBinding<P> bindin
886888 private <P > boolean isInstanceOrAreInstances (
887889 Object value , QueryParameterBinding <P > binding , BindableType <? super P > parameterType ) {
888890 return binding .isMultiValued () && value instanceof Collection <?> values
889- ? areInstances ( parameterType , values )
890- : isInstance ( parameterType , value );
891+ ? areInstances ( parameterType , values , getNodeBuilder (), getSession () )
892+ : isInstance ( parameterType , value , getNodeBuilder (), getSession () );
891893 }
892894
893895 @ Override
@@ -916,8 +918,8 @@ private boolean multipleBinding(QueryParameter<?> parameter, Object value){
916918 final var hibernateType = parameter .getHibernateType ();
917919 return hibernateType == null
918920 || values .isEmpty ()
919- || !isInstance ( hibernateType , value )
920- || isInstance ( hibernateType , values .iterator ().next () );
921+ || !isInstance ( hibernateType , value , getNodeBuilder (), getSession () )
922+ || isInstance ( hibernateType , values .iterator ().next (), getNodeBuilder (), getSession () );
921923 }
922924 else {
923925 return false ;
@@ -932,67 +934,6 @@ private <T> void setTypedParameter(int position, TypedParameterValue<T> typedVal
932934 setParameter ( position , typedValue .value (), typedValue .type () );
933935 }
934936
935- private boolean isInstance (Type <?> parameterType , Object value ) {
936- if ( value == null ) {
937- return true ;
938- }
939- final var sqmExpressible = getNodeBuilder ().resolveExpressible ( parameterType );
940- assert sqmExpressible != null ;
941- final var javaType = sqmExpressible .getExpressibleJavaType ();
942- if ( !javaType .isInstance ( value ) ) {
943- try {
944- // if this succeeds, we are good
945- javaType .wrap ( value , session );
946- }
947- catch ( HibernateException |UnsupportedOperationException e ) {
948- return false ;
949- }
950- }
951- return true ;
952- }
953-
954- private boolean areInstances (Type <?> parameterType , Collection <?> values ) {
955- if ( values .isEmpty () ) {
956- return true ;
957- }
958- final var sqmExpressible = getNodeBuilder ().resolveExpressible ( parameterType );
959- assert sqmExpressible != null ;
960- final var javaType = sqmExpressible .getExpressibleJavaType ();
961- for ( Object value : values ) {
962- if ( !javaType .isInstance ( value ) ) {
963- try {
964- // if this succeeds, we are good
965- javaType .wrap ( value , session );
966- }
967- catch (HibernateException | UnsupportedOperationException e ) {
968- return false ;
969- }
970- }
971- }
972- return true ;
973- }
974-
975- private boolean areInstances (Type <?> parameterType , Object [] values ) {
976- if ( values .length == 0 ) {
977- return true ;
978- }
979- final var sqmExpressible = getNodeBuilder ().resolveExpressible ( parameterType );
980- assert sqmExpressible != null ;
981- final var javaType = sqmExpressible .getExpressibleJavaType ();
982- for ( Object value : values ) {
983- if ( !javaType .isInstance ( value ) ) {
984- try {
985- // if this succeeds, we are good
986- javaType .wrap ( value , session );
987- }
988- catch (HibernateException | UnsupportedOperationException e ) {
989- return false ;
990- }
991- }
992- }
993- return true ;
994- }
995-
996937 private NodeBuilder getNodeBuilder () {
997938 return getSessionFactory ().getQueryEngine ().getCriteriaBuilder ();
998939 }
@@ -1196,7 +1137,7 @@ public CommonQueryContract setParameterList(String name, Object[] values) {
11961137 private <P > void setParameterValues (Object [] values , QueryParameterBinding <P > binding ) {
11971138 final var parameterType = binding .getBindType ();
11981139 if ( parameterType != null
1199- && !areInstances ( values , parameterType ) ) {
1140+ && !areInstances ( parameterType , values , getNodeBuilder (), getSession () ) ) {
12001141 throw new QueryArgumentException ( "Argument to query parameter has an incompatible type" ,
12011142 parameterType .getJavaType (), values .getClass ().getComponentType (), values );
12021143 }
@@ -1205,11 +1146,6 @@ private <P> void setParameterValues(Object[] values, QueryParameterBinding<P> bi
12051146 binding .setBindValues ( List .of ( castArray ) );
12061147 }
12071148
1208- private <P > boolean areInstances (Object [] values , BindableType <? super P > parameterType ) {
1209- return parameterType .getJavaType ().isAssignableFrom ( values .getClass ().getComponentType () )
1210- || areInstances ( parameterType , values );
1211- }
1212-
12131149 @ Override
12141150 public <P > CommonQueryContract setParameterList (String name , P [] values , Class <P > javaType ) {
12151151 final var javaDescriptor = getJavaType ( javaType );
0 commit comments