6
6
*/
7
7
package org .hibernate .type ;
8
8
9
- import java .lang .reflect .Array ;
10
- import java .sql .CallableStatement ;
11
- import java .sql .PreparedStatement ;
12
- import java .sql .ResultSet ;
13
- import java .sql .SQLException ;
14
-
15
- import org .hibernate .type .descriptor .converter .spi .BasicValueConverter ;
16
- import org .hibernate .type .descriptor .ValueBinder ;
17
- import org .hibernate .type .descriptor .ValueExtractor ;
18
- import org .hibernate .type .descriptor .WrapperOptions ;
19
9
import org .hibernate .type .descriptor .java .JavaType ;
20
- import org .hibernate .type .descriptor .jdbc .JdbcLiteralFormatter ;
21
10
import org .hibernate .type .descriptor .jdbc .JdbcType ;
22
11
import org .hibernate .type .descriptor .jdbc .JdbcTypeIndicators ;
23
- import org .hibernate .type .descriptor .jdbc .internal .JdbcLiteralFormatterArray ;
24
- import org .hibernate .type .spi .TypeConfiguration ;
25
12
26
13
/**
27
14
* A type that maps between {@link java.sql.Types#ARRAY ARRAY} and {@code T[]}
@@ -35,118 +22,11 @@ public class BasicArrayType<T>
35
22
36
23
private final BasicType <T > baseDescriptor ;
37
24
private final String name ;
38
- private final ValueBinder <T []> jdbcValueBinder ;
39
- private final ValueExtractor <T []> jdbcValueExtractor ;
40
- private final JdbcLiteralFormatter <T []> jdbcLiteralFormatter ;
41
25
42
26
public BasicArrayType (BasicType <T > baseDescriptor , JdbcType arrayJdbcType , JavaType <T []> arrayTypeDescriptor ) {
43
27
super ( arrayJdbcType , arrayTypeDescriptor );
44
28
this .baseDescriptor = baseDescriptor ;
45
29
this .name = baseDescriptor .getName () + "[]" ;
46
- final ValueBinder <T []> jdbcValueBinder = super .getJdbcValueBinder ();
47
- final ValueExtractor <T []> jdbcValueExtractor = super .getJdbcValueExtractor ();
48
- final JdbcLiteralFormatter jdbcLiteralFormatter = super .getJdbcLiteralFormatter ();
49
- //noinspection unchecked
50
- final BasicValueConverter <T , Object > valueConverter = (BasicValueConverter <T , Object >) baseDescriptor .getValueConverter ();
51
- if ( valueConverter != null ) {
52
- this .jdbcValueBinder = new ValueBinder <>() {
53
- @ Override
54
- public void bind (PreparedStatement st , T [] value , int index , WrapperOptions options )
55
- throws SQLException {
56
- jdbcValueBinder .bind ( st , getValue ( value , valueConverter , options ), index , options );
57
- }
58
-
59
- @ Override
60
- public void bind (CallableStatement st , T [] value , String name , WrapperOptions options )
61
- throws SQLException {
62
- jdbcValueBinder .bind ( st , getValue ( value , valueConverter , options ), name , options );
63
- }
64
-
65
- private T [] getValue (
66
- T [] value ,
67
- BasicValueConverter <T , Object > valueConverter ,
68
- WrapperOptions options ) {
69
- if ( value == null ) {
70
- return null ;
71
- }
72
- final JdbcType elementJdbcType = baseDescriptor .getJdbcType ();
73
- final TypeConfiguration typeConfiguration = options .getSessionFactory ().getTypeConfiguration ();
74
- final JdbcType underlyingJdbcType = typeConfiguration .getJdbcTypeRegistry ()
75
- .getDescriptor ( elementJdbcType .getDefaultSqlTypeCode () );
76
- final Class <?> preferredJavaTypeClass = underlyingJdbcType .getPreferredJavaTypeClass ( options );
77
- final Class <?> elementJdbcJavaTypeClass ;
78
- if ( preferredJavaTypeClass == null ) {
79
- elementJdbcJavaTypeClass = underlyingJdbcType .getJdbcRecommendedJavaTypeMapping (
80
- null ,
81
- null ,
82
- typeConfiguration
83
- ).getJavaTypeClass ();
84
- }
85
- else {
86
- elementJdbcJavaTypeClass = preferredJavaTypeClass ;
87
- }
88
-
89
- if ( value .getClass ().getComponentType () == elementJdbcJavaTypeClass ) {
90
- return value ;
91
- }
92
- final Object [] array = (Object []) Array .newInstance ( elementJdbcJavaTypeClass , value .length );
93
- for ( int i = 0 ; i < value .length ; i ++ ) {
94
- array [i ] = valueConverter .getRelationalJavaType ().unwrap (
95
- valueConverter .toRelationalValue ( value [i ] ),
96
- elementJdbcJavaTypeClass ,
97
- options
98
- );
99
- }
100
- //noinspection unchecked
101
- return (T []) array ;
102
- }
103
- };
104
- this .jdbcValueExtractor = new ValueExtractor <T []>() {
105
- @ Override
106
- public T [] extract (ResultSet rs , int paramIndex , WrapperOptions options ) throws SQLException {
107
- return getValue ( jdbcValueExtractor .extract ( rs , paramIndex , options ), valueConverter );
108
- }
109
-
110
- @ Override
111
- public T [] extract (CallableStatement statement , int paramIndex , WrapperOptions options )
112
- throws SQLException {
113
- return getValue ( jdbcValueExtractor .extract ( statement , paramIndex , options ), valueConverter );
114
- }
115
-
116
- @ Override
117
- public T [] extract (CallableStatement statement , String paramName , WrapperOptions options )
118
- throws SQLException {
119
- return getValue ( jdbcValueExtractor .extract ( statement , paramName , options ), valueConverter );
120
- }
121
-
122
- private T [] getValue (T [] value , BasicValueConverter <T , Object > valueConverter ) {
123
- if ( value == null ) {
124
- return null ;
125
- }
126
- if ( value .getClass ().getComponentType () == valueConverter .getDomainJavaType ().getJavaTypeClass () ) {
127
- return value ;
128
- }
129
- //noinspection unchecked
130
- final T [] array = (T []) Array .newInstance (
131
- valueConverter .getDomainJavaType ().getJavaTypeClass (),
132
- value .length
133
- );
134
- for ( int i = 0 ; i < value .length ; i ++ ) {
135
- array [i ] = valueConverter .toDomainValue ( value [i ] );
136
- }
137
- return array ;
138
- }
139
- };
140
- this .jdbcLiteralFormatter = new JdbcLiteralFormatterArray (
141
- baseDescriptor .getJavaTypeDescriptor (),
142
- jdbcLiteralFormatter
143
- );
144
- }
145
- else {
146
- this .jdbcValueBinder = jdbcValueBinder ;
147
- this .jdbcValueExtractor = jdbcValueExtractor ;
148
- this .jdbcLiteralFormatter = jdbcLiteralFormatter ;
149
- }
150
30
}
151
31
152
32
@ Override
@@ -164,21 +44,6 @@ protected boolean registerUnderJavaType() {
164
44
return true ;
165
45
}
166
46
167
- @ Override
168
- public ValueExtractor <T []> getJdbcValueExtractor () {
169
- return jdbcValueExtractor ;
170
- }
171
-
172
- @ Override
173
- public ValueBinder <T []> getJdbcValueBinder () {
174
- return jdbcValueBinder ;
175
- }
176
-
177
- @ Override
178
- public JdbcLiteralFormatter getJdbcLiteralFormatter () {
179
- return jdbcLiteralFormatter ;
180
- }
181
-
182
47
@ Override
183
48
public <X > BasicType <X > resolveIndicatedType (JdbcTypeIndicators indicators , JavaType <X > domainJtd ) {
184
49
// TODO: maybe fallback to some encoding by default if the DB doesn't support arrays natively?
0 commit comments