Skip to content

Commit 2661e5c

Browse files
committed
HHH-17662 Replace JdbcTypeConstructor uses for arrays with uniform resolve method
1 parent 5d348fc commit 2661e5c

File tree

13 files changed

+228
-172
lines changed

13 files changed

+228
-172
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -300,15 +300,13 @@ public JdbcType resolveSqlTypeDescriptor(
300300
}
301301
break;
302302
case ARRAY:
303-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
304303
// PostgreSQL names array types by prepending an underscore to the base name
305-
if ( jdbcTypeConstructor != null && columnTypeName.charAt( 0 ) == '_' ) {
304+
if ( columnTypeName.charAt( 0 ) == '_' ) {
306305
final String componentTypeName = columnTypeName.substring( 1 );
307306
final Integer sqlTypeCode = resolveSqlTypeCode( componentTypeName, jdbcTypeRegistry.getTypeConfiguration() );
308307
if ( sqlTypeCode != null ) {
309-
return jdbcTypeConstructor.resolveType(
310-
jdbcTypeRegistry.getTypeConfiguration(),
311-
this,
308+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
309+
jdbcTypeCode,
312310
jdbcTypeRegistry.getDescriptor( sqlTypeCode ),
313311
ColumnTypeInformation.EMPTY
314312
);

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@
100100
import org.hibernate.type.descriptor.jdbc.AggregateJdbcType;
101101
import org.hibernate.type.descriptor.jdbc.BlobJdbcType;
102102
import org.hibernate.type.descriptor.jdbc.JdbcType;
103-
import org.hibernate.type.descriptor.jdbc.JdbcTypeConstructor;
104103
import org.hibernate.type.descriptor.jdbc.OracleJsonBlobJdbcType;
105104
import org.hibernate.type.descriptor.jdbc.NullJdbcType;
106105
import org.hibernate.type.descriptor.jdbc.ObjectNullAsNullTypeJdbcType;
@@ -760,15 +759,11 @@ public JdbcType resolveSqlTypeDescriptor(
760759
break;
761760
case ARRAY:
762761
if ( "MDSYS.SDO_ORDINATE_ARRAY".equals( columnTypeName ) ) {
763-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
764-
if ( jdbcTypeConstructor != null ) {
765-
return jdbcTypeConstructor.resolveType(
766-
jdbcTypeRegistry.getTypeConfiguration(),
767-
this,
768-
jdbcTypeRegistry.getDescriptor( NUMERIC ),
769-
ColumnTypeInformation.EMPTY
770-
);
771-
}
762+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
763+
jdbcTypeCode,
764+
jdbcTypeRegistry.getDescriptor( NUMERIC ),
765+
ColumnTypeInformation.EMPTY
766+
);
772767
}
773768
break;
774769
case Types.NUMERIC:

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacyDialect.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -328,15 +328,13 @@ public JdbcType resolveSqlTypeDescriptor(
328328
}
329329
break;
330330
case ARRAY:
331-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
332331
// PostgreSQL names array types by prepending an underscore to the base name
333-
if ( jdbcTypeConstructor != null && columnTypeName.charAt( 0 ) == '_' ) {
332+
if ( columnTypeName.charAt( 0 ) == '_' ) {
334333
final String componentTypeName = columnTypeName.substring( 1 );
335334
final Integer sqlTypeCode = resolveSqlTypeCode( componentTypeName, jdbcTypeRegistry.getTypeConfiguration() );
336335
if ( sqlTypeCode != null ) {
337-
return jdbcTypeConstructor.resolveType(
338-
jdbcTypeRegistry.getTypeConfiguration(),
339-
this,
336+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
337+
jdbcTypeCode,
340338
jdbcTypeRegistry.getDescriptor( sqlTypeCode ),
341339
ColumnTypeInformation.EMPTY
342340
);

hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,13 @@ public JdbcType resolveSqlTypeDescriptor(
318318
}
319319
break;
320320
case ARRAY:
321-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
322321
// PostgreSQL names array types by prepending an underscore to the base name
323-
if ( jdbcTypeConstructor != null && columnTypeName.charAt( 0 ) == '_' ) {
322+
if ( columnTypeName.charAt( 0 ) == '_' ) {
324323
final String componentTypeName = columnTypeName.substring( 1 );
325324
final Integer sqlTypeCode = resolveSqlTypeCode( componentTypeName, jdbcTypeRegistry.getTypeConfiguration() );
326325
if ( sqlTypeCode != null ) {
327-
return jdbcTypeConstructor.resolveType(
328-
jdbcTypeRegistry.getTypeConfiguration(),
329-
this,
326+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
327+
jdbcTypeCode,
330328
jdbcTypeRegistry.getDescriptor( sqlTypeCode ),
331329
ColumnTypeInformation.EMPTY
332330
);

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -725,22 +725,18 @@ public JdbcType resolveSqlTypeDescriptor(
725725
int scale,
726726
JdbcTypeRegistry jdbcTypeRegistry) {
727727
if ( jdbcTypeCode == ARRAY ) {
728-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
729-
if ( jdbcTypeConstructor != null ) {
730-
// Special handling for array types, because we need the proper element/component type
731-
// To determine the element JdbcType, we pass the database reported type to #resolveSqlTypeCode
732-
final int arraySuffixIndex = columnTypeName.toLowerCase( Locale.ROOT ).indexOf( " array" );
733-
if ( arraySuffixIndex != -1 ) {
734-
final String componentTypeName = columnTypeName.substring( 0, arraySuffixIndex );
735-
final Integer sqlTypeCode = resolveSqlTypeCode( componentTypeName, jdbcTypeRegistry.getTypeConfiguration() );
736-
if ( sqlTypeCode != null ) {
737-
return jdbcTypeConstructor.resolveType(
738-
jdbcTypeRegistry.getTypeConfiguration(),
739-
this,
740-
jdbcTypeRegistry.getDescriptor( sqlTypeCode ),
741-
ColumnTypeInformation.EMPTY
742-
);
743-
}
728+
// Special handling for array types, because we need the proper element/component type
729+
// To determine the element JdbcType, we pass the database reported type to #resolveSqlTypeCode
730+
final int arraySuffixIndex = columnTypeName.toLowerCase( Locale.ROOT ).indexOf( " array" );
731+
if ( arraySuffixIndex != -1 ) {
732+
final String componentTypeName = columnTypeName.substring( 0, arraySuffixIndex );
733+
final Integer sqlTypeCode = resolveSqlTypeCode( componentTypeName, jdbcTypeRegistry.getTypeConfiguration() );
734+
if ( sqlTypeCode != null ) {
735+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
736+
jdbcTypeCode,
737+
jdbcTypeRegistry.getDescriptor( sqlTypeCode ),
738+
ColumnTypeInformation.EMPTY
739+
);
744740
}
745741
}
746742
}

hibernate-core/src/main/java/org/hibernate/dialect/OracleArrayJdbcTypeConstructor.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,21 @@ public JdbcType resolveType(
4646
JdbcType elementType,
4747
ColumnTypeInformation columnTypeInformation) {
4848
// a bit wrong, since columnTypeInformation.getTypeName() is typically null!
49-
return new OracleArrayJdbcType(
50-
elementType,
51-
columnTypeInformation == null ? null : columnTypeInformation.getTypeName()
52-
);
49+
String typeName = columnTypeInformation == null ? null : columnTypeInformation.getTypeName();
50+
if ( typeName == null || typeName.isBlank() ) {
51+
Integer precision = null;
52+
Integer scale = null;
53+
if ( columnTypeInformation != null ) {
54+
precision = columnTypeInformation.getColumnSize();
55+
scale = columnTypeInformation.getDecimalDigits();
56+
}
57+
typeName = OracleArrayJdbcType.getTypeName( elementType.getJdbcRecommendedJavaTypeMapping(
58+
precision,
59+
scale,
60+
typeConfiguration
61+
), dialect );
62+
}
63+
return new OracleArrayJdbcType( elementType, typeName );
5364
}
5465

5566
@Override

hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -799,15 +799,11 @@ public JdbcType resolveSqlTypeDescriptor(
799799
break;
800800
case ARRAY:
801801
if ( "MDSYS.SDO_ORDINATE_ARRAY".equals( columnTypeName ) ) {
802-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
803-
if ( jdbcTypeConstructor != null ) {
804-
return jdbcTypeConstructor.resolveType(
805-
jdbcTypeRegistry.getTypeConfiguration(),
806-
this,
807-
jdbcTypeRegistry.getDescriptor( NUMERIC ),
808-
ColumnTypeInformation.EMPTY
809-
);
810-
}
802+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
803+
jdbcTypeCode,
804+
jdbcTypeRegistry.getDescriptor( NUMERIC ),
805+
ColumnTypeInformation.EMPTY
806+
);
811807
}
812808
break;
813809
case NUMERIC:

hibernate-core/src/main/java/org/hibernate/dialect/OracleNestedTableJdbcTypeConstructor.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,21 @@ public JdbcType resolveType(
4040
JdbcType elementType,
4141
ColumnTypeInformation columnTypeInformation) {
4242
// a bit wrong, since columnTypeInformation.getTypeName() is typically null!
43-
return new OracleNestedTableJdbcType(
44-
elementType,
45-
columnTypeInformation == null ? null : columnTypeInformation.getTypeName()
46-
);
43+
String typeName = columnTypeInformation == null ? null : columnTypeInformation.getTypeName();
44+
if ( typeName == null || typeName.isBlank() ) {
45+
Integer precision = null;
46+
Integer scale = null;
47+
if ( columnTypeInformation != null ) {
48+
precision = columnTypeInformation.getColumnSize();
49+
scale = columnTypeInformation.getDecimalDigits();
50+
}
51+
typeName = OracleArrayJdbcType.getTypeName( elementType.getJdbcRecommendedJavaTypeMapping(
52+
precision,
53+
scale,
54+
typeConfiguration
55+
), dialect );
56+
}
57+
return new OracleNestedTableJdbcType( elementType, typeName );
4758
}
4859

4960
@Override

hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -347,15 +347,13 @@ public JdbcType resolveSqlTypeDescriptor(
347347
}
348348
break;
349349
case ARRAY:
350-
final JdbcTypeConstructor jdbcTypeConstructor = jdbcTypeRegistry.getConstructor( jdbcTypeCode );
351350
// PostgreSQL names array types by prepending an underscore to the base name
352-
if ( jdbcTypeConstructor != null && columnTypeName.charAt( 0 ) == '_' ) {
351+
if ( columnTypeName.charAt( 0 ) == '_' ) {
353352
final String componentTypeName = columnTypeName.substring( 1 );
354353
final Integer sqlTypeCode = resolveSqlTypeCode( componentTypeName, jdbcTypeRegistry.getTypeConfiguration() );
355354
if ( sqlTypeCode != null ) {
356-
return jdbcTypeConstructor.resolveType(
357-
jdbcTypeRegistry.getTypeConfiguration(),
358-
this,
355+
return jdbcTypeRegistry.resolveTypeConstructorDescriptor(
356+
jdbcTypeCode,
359357
jdbcTypeRegistry.getDescriptor( sqlTypeCode ),
360358
ColumnTypeInformation.EMPTY
361359
);

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/AbstractArrayJavaType.java

Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
import org.hibernate.type.ConvertedBasicArrayType;
1818
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
1919
import org.hibernate.type.descriptor.jdbc.JdbcType;
20-
import org.hibernate.type.descriptor.jdbc.JdbcTypeConstructor;
2120
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
22-
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
2321
import org.hibernate.type.internal.BasicTypeImpl;
2422
import org.hibernate.type.spi.TypeConfiguration;
2523

@@ -41,11 +39,9 @@ public JavaType<E> getElementJavaType() {
4139
@Override
4240
public JdbcType getRecommendedJdbcType(JdbcTypeIndicators indicators) {
4341
// Always determine the recommended type to make sure this is a valid basic java type
44-
return getArrayJdbcType(
45-
indicators.getTypeConfiguration(),
46-
indicators.getDialect(),
42+
return indicators.getTypeConfiguration().getJdbcTypeRegistry().resolveTypeConstructorDescriptor(
4743
indicators.getPreferredSqlTypeCodeForArray(),
48-
new BasicTypeImpl<>( getElementJavaType(), componentJavaType.getRecommendedJdbcType( indicators ) ),
44+
new BasicTypeImpl<>( componentJavaType, componentJavaType.getRecommendedJdbcType( indicators ) ),
4945
ColumnTypeInformation.EMPTY
5046
);
5147
}
@@ -86,9 +82,7 @@ <F> BasicType<T> createTypeUsingConverter(
8682
final JavaType<?> relationalJavaType = typeConfiguration.getJavaTypeRegistry().getDescriptor( convertedArrayClass );
8783
return new ConvertedBasicArrayType<>(
8884
elementType,
89-
getArrayJdbcType(
90-
typeConfiguration,
91-
dialect,
85+
typeConfiguration.getJdbcTypeRegistry().resolveTypeConstructorDescriptor(
9286
stdIndicators.getExplicitJdbcTypeCode(),
9387
elementType,
9488
columnTypeInformation
@@ -105,9 +99,7 @@ BasicType<T> resolveType(
10599
BasicType<E> elementType,
106100
ColumnTypeInformation columnTypeInformation,
107101
JdbcTypeIndicators stdIndicators) {
108-
final JdbcType arrayJdbcType = getArrayJdbcType(
109-
typeConfiguration,
110-
dialect,
102+
final JdbcType arrayJdbcType = typeConfiguration.getJdbcTypeRegistry().resolveTypeConstructorDescriptor(
111103
stdIndicators.getExplicitJdbcTypeCode(),
112104
elementType,
113105
columnTypeInformation
@@ -117,53 +109,6 @@ BasicType<T> resolveType(
117109
arrayJdbcType,
118110
() -> new BasicArrayType<>( elementType, arrayJdbcType, arrayJavaType )
119111
);
120-
// return typeConfiguration.getBasicTypeRegistry().getRegisteredType( elementType.getName() ) == elementType
121-
// ? typeConfiguration.standardBasicTypeForJavaType(
122-
// arrayJavaType.getJavaType(),
123-
// javaType -> basicArrayType( typeConfiguration, dialect, elementType, columnTypeInformation, stdIndicators, arrayJavaType )
124-
// )
125-
// : basicArrayType( typeConfiguration, dialect, elementType, columnTypeInformation, stdIndicators, arrayJavaType );
126112
}
127113

128-
// BasicType<T> basicArrayType(
129-
// TypeConfiguration typeConfiguration,
130-
// Dialect dialect,
131-
// BasicType<E> elementType,
132-
// ColumnTypeInformation columnTypeInformation,
133-
// JdbcTypeIndicators stdIndicators,
134-
// JavaType<T> javaType) {
135-
// return new BasicArrayType<>(
136-
// elementType,
137-
// getArrayJdbcType(
138-
// typeConfiguration,
139-
// dialect,
140-
// stdIndicators.getExplicitJdbcTypeCode(),
141-
// elementType,
142-
// columnTypeInformation
143-
// ),
144-
// javaType
145-
// );
146-
// }
147-
148-
static JdbcType getArrayJdbcType(
149-
TypeConfiguration typeConfiguration,
150-
Dialect dialect,
151-
int preferredSqlTypeCodeForArray,
152-
BasicType<?> elementType,
153-
ColumnTypeInformation columnTypeInformation) {
154-
final JdbcTypeRegistry jdbcTypeRegistry = typeConfiguration.getJdbcTypeRegistry();
155-
final JdbcTypeConstructor arrayJdbcTypeConstructor =
156-
jdbcTypeRegistry.getConstructor( preferredSqlTypeCodeForArray );
157-
if ( arrayJdbcTypeConstructor != null ) {
158-
return arrayJdbcTypeConstructor.resolveType(
159-
typeConfiguration,
160-
dialect,
161-
elementType,
162-
columnTypeInformation
163-
);
164-
}
165-
else {
166-
return jdbcTypeRegistry.getDescriptor( preferredSqlTypeCodeForArray );
167-
}
168-
}
169114
}

0 commit comments

Comments
 (0)