3131import org .hibernate .type .internal .ParameterizedTypeImpl ;
3232import org .hibernate .type .spi .TypeConfiguration ;
3333
34+ import static java .lang .reflect .Array .newInstance ;
3435import static org .hibernate .type .descriptor .jdbc .StructHelper .instantiate ;
3536
3637/**
@@ -62,44 +63,41 @@ public <T> JavaType<T> getJdbcRecommendedJavaTypeMapping(
6263 Integer precision ,
6364 Integer scale ,
6465 TypeConfiguration typeConfiguration ) {
65- final JavaType <Object > elementJavaType = elementJdbcType .getJdbcRecommendedJavaTypeMapping (
66- precision ,
67- scale ,
68- typeConfiguration
69- );
70- final JavaType <Object > javaType = typeConfiguration .getJavaTypeRegistry ().resolveDescriptor (
71- Array .newInstance ( elementJavaType .getJavaTypeClass (), 0 ).getClass ()
72- );
66+ final JavaType <?> elementJavaType =
67+ elementJdbcType .getJdbcRecommendedJavaTypeMapping ( precision , scale , typeConfiguration );
68+ final JavaType <?> javaType =
69+ typeConfiguration .getJavaTypeRegistry ()
70+ .resolveDescriptor ( newInstance ( elementJavaType .getJavaTypeClass (), 0 ).getClass () );
7371 if ( javaType instanceof BasicPluralType <?, ?> ) {
7472 //noinspection unchecked
7573 return (JavaType <T >) javaType ;
7674 }
77- //noinspection unchecked
78- return (JavaType <T >) javaType .createJavaType (
79- new ParameterizedTypeImpl ( javaType .getJavaTypeClass (), new Type [0 ], null ),
80- typeConfiguration
81- );
75+ else {
76+ //noinspection unchecked
77+ return (JavaType <T >) javaType .createJavaType (
78+ new ParameterizedTypeImpl ( javaType .getJavaTypeClass (), new Type [0 ], null ),
79+ typeConfiguration
80+ );
81+ }
8282 }
8383
84- @ Override
85- public <T > JdbcLiteralFormatter <T > getJdbcLiteralFormatter (JavaType <T > javaTypeDescriptor ) {
86- final JavaType <T > elementJavaType ;
84+ private static JavaType <?> elementJavaType (JavaType <?> javaTypeDescriptor ) {
8785 if ( javaTypeDescriptor instanceof ByteArrayJavaType ) {
8886 // Special handling needed for Byte[], because that would conflict with the VARBINARY mapping
89- //noinspection unchecked
90- elementJavaType = (JavaType <T >) ByteJavaType .INSTANCE ;
87+ return ByteJavaType .INSTANCE ;
9188 }
92- else if ( javaTypeDescriptor instanceof BasicPluralJavaType ) {
93- //noinspection unchecked
94- elementJavaType = ((BasicPluralJavaType <T >) javaTypeDescriptor ).getElementJavaType ();
89+ else if ( javaTypeDescriptor instanceof BasicPluralJavaType <?> basicPluralJavaType ) {
90+ return basicPluralJavaType .getElementJavaType ();
9591 }
9692 else {
9793 throw new IllegalArgumentException ("not a BasicPluralJavaType" );
9894 }
99- return new JdbcLiteralFormatterArray <>(
100- javaTypeDescriptor ,
101- elementJdbcType .getJdbcLiteralFormatter ( elementJavaType )
102- );
95+ }
96+
97+ @ Override
98+ public <T > JdbcLiteralFormatter <T > getJdbcLiteralFormatter (JavaType <T > javaTypeDescriptor ) {
99+ return new JdbcLiteralFormatterArray <>( javaTypeDescriptor ,
100+ elementJdbcType .getJdbcLiteralFormatter ( elementJavaType ( javaTypeDescriptor ) ) );
103101 }
104102
105103 @ Override
@@ -113,30 +111,18 @@ protected String getElementTypeName(JavaType<?> javaType, SharedSessionContractI
113111 if ( elementJdbcType instanceof StructuredJdbcType structJdbcType ) {
114112 return structJdbcType .getStructTypeName ();
115113 }
116- final JavaType <?> elementJavaType ;
117- if ( javaType instanceof ByteArrayJavaType ) {
118- // Special handling needed for Byte[], because that would conflict with the VARBINARY mapping
119- elementJavaType = ByteJavaType .INSTANCE ;
120- }
121- else {
122- elementJavaType = ( (BasicPluralJavaType <?>) javaType ).getElementJavaType ();
123- }
124- final Size size = session .getJdbcServices ()
125- .getDialect ()
126- .getSizeStrategy ()
127- .resolveSize ( elementJdbcType , elementJavaType , null , null , null );
114+ final JavaType <?> elementJavaType = elementJavaType ( javaType );
115+ final Size size =
116+ session .getJdbcServices ().getDialect ().getSizeStrategy ()
117+ .resolveSize ( elementJdbcType , elementJavaType , null , null , null );
128118 final DdlTypeRegistry ddlTypeRegistry = session .getTypeConfiguration ().getDdlTypeRegistry ();
129- final String typeName = ddlTypeRegistry .getDescriptor ( elementJdbcType .getDdlTypeCode () )
130- .getTypeName ( size , new BasicTypeImpl <>( elementJavaType , elementJdbcType ), ddlTypeRegistry );
131- int cutIndex = typeName .indexOf ( '(' );
132- if ( cutIndex > 0 ) {
133- // getTypeName for this case required length, etc, parameters.
134- // Cut them out and use database defaults.
135- return typeName .substring ( 0 , cutIndex );
136- }
137- else {
138- return typeName ;
139- }
119+ final String typeName =
120+ ddlTypeRegistry .getDescriptor ( elementJdbcType .getDdlTypeCode () )
121+ .getTypeName ( size , new BasicTypeImpl <>( elementJavaType , elementJdbcType ), ddlTypeRegistry );
122+ // getTypeName for this case required length, etc, parameters.
123+ // Cut them out and use database defaults.
124+ final int cutIndex = typeName .indexOf ( '(' );
125+ return cutIndex > 0 ? typeName .substring ( 0 , cutIndex ) : typeName ;
140126 }
141127
142128 protected <T > Object [] getArray (BasicBinder <?> binder , ValueBinder <T > elementBinder , T value , WrapperOptions options )
@@ -157,20 +143,23 @@ protected <T> Object[] getArray(BasicBinder<?> binder, ValueBinder<T> elementBin
157143 else {
158144 final TypeConfiguration typeConfiguration = options .getTypeConfiguration ();
159145 final JdbcType underlyingJdbcType =
160- typeConfiguration .getJdbcTypeRegistry ().getDescriptor ( elementJdbcType .getDefaultSqlTypeCode () );
146+ typeConfiguration .getJdbcTypeRegistry ()
147+ .getDescriptor ( elementJdbcType .getDefaultSqlTypeCode () );
161148 final Class <?> preferredJavaTypeClass = elementJdbcType .getPreferredJavaTypeClass ( options );
162149 final Class <?> elementJdbcJavaTypeClass =
163150 preferredJavaTypeClass == null
164151 ? underlyingJdbcType .getJdbcRecommendedJavaTypeMapping (null , null , typeConfiguration )
165152 .getJavaTypeClass ()
166153 : preferredJavaTypeClass ;
167- final Class <? extends Object []> arrayClass = (Class <? extends Object []>)
168- Array . newInstance ( elementJdbcJavaTypeClass , 0 ).getClass ();
154+ final var arrayClass = (Class <? extends Object []>)
155+ newInstance ( elementJdbcJavaTypeClass , 0 ).getClass ();
169156 return javaType .unwrap ( value , arrayClass , options );
170157 }
171158 }
172159
173- protected <X > X getArray (BasicExtractor <X > extractor , java .sql .Array array , WrapperOptions options ) throws SQLException {
160+ protected <X > X getArray (BasicExtractor <X > extractor , java .sql .Array array , WrapperOptions options )
161+ throws SQLException {
162+ final JavaType <X > javaType = extractor .getJavaType ();
174163 if ( array != null && getElementJdbcType () instanceof AggregateJdbcType aggregateJdbcType ) {
175164 final EmbeddableMappingType embeddableMappingType = aggregateJdbcType .getEmbeddableMappingType ();
176165 final Object rawArray = array .getArray ();
@@ -187,10 +176,10 @@ protected <X> X getArray(BasicExtractor<X> extractor, java.sql.Array array, Wrap
187176 domainObjects [i ] = instantiate ( embeddableMappingType , attributeValues );
188177 }
189178 }
190- return extractor . getJavaType () .wrap ( domainObjects , options );
179+ return javaType .wrap ( domainObjects , options );
191180 }
192181 else {
193- return extractor . getJavaType () .wrap ( array , options );
182+ return javaType .wrap ( array , options );
194183 }
195184 }
196185
@@ -209,9 +198,9 @@ protected void doBind(PreparedStatement st, X value, int index, WrapperOptions o
209198 @ Override
210199 protected void doBind (CallableStatement st , X value , String name , WrapperOptions options )
211200 throws SQLException {
212- final java .sql .Array arr = getArray ( value , options );
201+ final java .sql .Array array = getArray ( value , options );
213202 try {
214- st .setObject ( name , arr , java .sql .Types .ARRAY );
203+ st .setObject ( name , array , java .sql .Types .ARRAY );
215204 }
216205 catch (SQLException ex ) {
217206 throw new HibernateException ( "JDBC driver does not support named parameters for setArray. Use positional." , ex );
@@ -266,16 +255,14 @@ public String toString() {
266255 }
267256
268257 /**
269- * Check equality. Needed so that ArrayJdbcType in collections correctly match each other.
270- *
271- * @param o other object
258+ * Check equality. Needed so that {@code ArrayJdbcType} in collections correctly match each other.
272259 * @return true if the two array types share the same element type
273260 */
274261 @ Override
275- public boolean equals (Object o ) {
276- return o != null
277- && getClass () == o .getClass ()
278- && getElementJdbcType ().equals ( ( ( ArrayJdbcType ) o ) .getElementJdbcType () );
262+ public boolean equals (Object that ) {
263+ return that instanceof ArrayJdbcType arrayJdbcType
264+ && this . getClass () == that .getClass ()
265+ && getElementJdbcType ().equals ( arrayJdbcType .getElementJdbcType () );
279266 }
280267
281268 @ Override
0 commit comments