55package org .hibernate .sql .exec .internal ;
66
77import java .util .Collection ;
8- import java .util .Collections ;
98import java .util .IdentityHashMap ;
109import java .util .List ;
1110import java .util .Map ;
1211import java .util .function .BiConsumer ;
1312
14- import org .hibernate .dialect .Dialect ;
1513import org .hibernate .engine .spi .SessionFactoryImplementor ;
1614import org .hibernate .metamodel .mapping .BasicValuedMapping ;
1715import org .hibernate .metamodel .mapping .JdbcMapping ;
1816import org .hibernate .type .BindableType ;
1917import org .hibernate .query .spi .QueryParameterBinding ;
2018import org .hibernate .query .spi .QueryParameterBindings ;
2119import org .hibernate .query .spi .QueryParameterImplementor ;
22- import org .hibernate .query .sql .internal .NativeQueryImpl ;
2320import org .hibernate .query .sql .spi .ParameterOccurrence ;
2421import org .hibernate .sql .ast .tree .expression .JdbcParameter ;
2522import org .hibernate .sql .exec .spi .JdbcParameterBinder ;
2825import org .hibernate .type .BasicTypeReference ;
2926import org .hibernate .type .descriptor .converter .spi .BasicValueConverter ;
3027
28+ import static java .util .Collections .emptyList ;
29+ import static org .hibernate .query .sql .internal .NativeQueryImpl .determineBindValueMaxCount ;
30+
3131/**
3232 * Standard implementation of JdbcParameterBindings
3333 *
@@ -50,42 +50,22 @@ public JdbcParameterBindingsImpl(
5050 if ( !parameterOccurrences .isEmpty () ) {
5151 bindingMap = new IdentityHashMap <>( parameterOccurrences .size () );
5252
53- final Dialect dialect = factory .getJdbcServices ().getDialect ();
5453 final boolean paddingEnabled = factory .getSessionFactoryOptions ().inClauseParameterPaddingEnabled ();
55- final int inExprLimit = dialect .getParameterCountLimit ();
54+ final int inExprLimit = factory . getJdbcServices (). getDialect () .getParameterCountLimit ();
5655
5756 for ( ParameterOccurrence occurrence : parameterOccurrences ) {
5857 final QueryParameterImplementor <?> param = occurrence .parameter ();
5958 final QueryParameterBinding <?> binding = queryParameterBindings .getBinding ( param );
6059
61- final JdbcMapping jdbcMapping ;
62-
63- final BindableType <?> type = determineParamType ( param , binding );
64- if ( type == null ) {
65- jdbcMapping = factory .getTypeConfiguration ().getBasicTypeForJavaType ( Object .class );
66- }
67- else if ( type instanceof BasicTypeReference <?> basicTypeReference ) {
68- jdbcMapping =
69- factory .getTypeConfiguration ().getBasicTypeRegistry ()
70- .resolve ( basicTypeReference );
71- }
72- else if ( type instanceof BasicValuedMapping basicValuedMapping ) {
73- jdbcMapping = basicValuedMapping .getJdbcMapping ();
74- }
75- else {
76- throw new IllegalArgumentException ( "Could not resolve NativeQuery parameter type : `" + param + "`" );
77- }
60+ final JdbcMapping jdbcMapping = jdbcMapping ( factory , param , binding );
7861
7962 final BasicValueConverter valueConverter = jdbcMapping == null ? null : jdbcMapping .getValueConverter ();
8063
8164 if ( binding .isMultiValued () ) {
8265 final Collection <?> bindValues = binding .getBindValues ();
8366 final int bindValueCount = bindValues .size ();
84- final int bindValueMaxCount = NativeQueryImpl .determineBindValueMaxCount (
85- paddingEnabled ,
86- inExprLimit ,
87- bindValueCount
88- );
67+ final int bindValueMaxCount =
68+ determineBindValueMaxCount ( paddingEnabled , inExprLimit , bindValueCount );
8969 Object lastBindValue = null ;
9070 if ( valueConverter != null ) {
9171 for ( Object bindValue : bindValues ) {
@@ -119,31 +99,38 @@ else if ( type instanceof BasicValuedMapping basicValuedMapping ) {
11999 }
120100 }
121101 else {
122- final Object bindValue ;
123- if ( valueConverter != null && binding .getBindValue () != null ) {
124- bindValue = valueConverter .toRelationalValue ( binding .getBindValue () );
125- }
126- else {
127- bindValue = binding .getBindValue ();
128- }
129-
102+ final Object bindValue =
103+ valueConverter != null && binding .getBindValue () != null
104+ ? valueConverter .toRelationalValue ( binding .getBindValue () )
105+ : binding .getBindValue ();
130106 final JdbcParameterImpl jdbcParameter = new JdbcParameterImpl ( jdbcMapping );
131107 jdbcParameterBinders .add ( jdbcParameter );
132- addBinding (
133- jdbcParameter ,
134- new JdbcParameterBindingImpl ( jdbcMapping , bindValue )
135- );
108+ addBinding ( jdbcParameter , new JdbcParameterBindingImpl ( jdbcMapping , bindValue ) );
136109 }
137110 }
138111 }
139112 }
140113
141- private BindableType <?> determineParamType ( QueryParameterImplementor <?> param , QueryParameterBinding <?> binding ) {
142- BindableType <?> type = binding . getBindType ( );
114+ private JdbcMapping jdbcMapping ( SessionFactoryImplementor factory , QueryParameterImplementor <?> param , QueryParameterBinding <?> binding ) {
115+ final BindableType <?> type = determineParamType ( param , binding );
143116 if ( type == null ) {
144- type = param . getHibernateType ( );
117+ return factory . getTypeConfiguration (). getBasicTypeForJavaType ( Object . class );
145118 }
146- return type ;
119+ else if ( type instanceof BasicTypeReference <?> basicTypeReference ) {
120+ return factory .getTypeConfiguration ().getBasicTypeRegistry ()
121+ .resolve ( basicTypeReference );
122+ }
123+ else if ( type instanceof BasicValuedMapping basicValuedMapping ) {
124+ return basicValuedMapping .getJdbcMapping ();
125+ }
126+ else {
127+ throw new IllegalArgumentException ( "Could not resolve NativeQuery parameter type : `" + param + "`" );
128+ }
129+ }
130+
131+ private BindableType <?> determineParamType (QueryParameterImplementor <?> param , QueryParameterBinding <?> binding ) {
132+ final BindableType <?> type = binding .getBindType ();
133+ return type == null ? param .getHibernateType () : type ;
147134 }
148135
149136 @ Override
@@ -157,24 +144,20 @@ public void addBinding(JdbcParameter parameter, JdbcParameterBinding binding) {
157144
158145 @ Override
159146 public Collection <JdbcParameterBinding > getBindings () {
160- return bindingMap == null ? Collections . emptyList () : bindingMap .values ();
147+ return bindingMap == null ? emptyList () : bindingMap .values ();
161148 }
162149
163150 @ Override
164151 public JdbcParameterBinding getBinding (JdbcParameter parameter ) {
165- if ( bindingMap == null ) {
166- return null ;
167- }
168- return bindingMap .get ( parameter );
152+ return bindingMap == null ? null : bindingMap .get ( parameter );
169153 }
170154
171155 @ Override
172156 public void visitBindings (BiConsumer <JdbcParameter , JdbcParameterBinding > action ) {
173- if ( bindingMap == null ) {
174- return ;
175- }
176- for ( Map .Entry <JdbcParameter , JdbcParameterBinding > entry : bindingMap .entrySet () ) {
177- action .accept ( entry .getKey (), entry .getValue () );
157+ if ( bindingMap != null ) {
158+ for ( var entry : bindingMap .entrySet () ) {
159+ action .accept ( entry .getKey (), entry .getValue () );
160+ }
178161 }
179162 }
180163
0 commit comments