19
19
import org .hibernate .loader .ast .spi .SqlArrayMultiKeyLoader ;
20
20
import org .hibernate .metamodel .mapping .ForeignKeyDescriptor ;
21
21
import org .hibernate .metamodel .mapping .JdbcMapping ;
22
+ import org .hibernate .metamodel .mapping .NonAggregatedIdentifierMapping ;
22
23
import org .hibernate .metamodel .mapping .PluralAttributeMapping ;
24
+ import org .hibernate .metamodel .mapping .ValuedModelPart ;
25
+ import org .hibernate .metamodel .mapping .internal .IdClassEmbeddable ;
23
26
import org .hibernate .query .spi .QueryOptions ;
24
27
import org .hibernate .sql .ast .tree .expression .JdbcParameter ;
25
28
import org .hibernate .sql .ast .tree .select .SelectStatement ;
45
48
public class CollectionBatchLoaderArrayParam
46
49
extends AbstractCollectionBatchLoader
47
50
implements SqlArrayMultiKeyLoader {
51
+ private final Class <?> keyDomainType ;
48
52
private final JdbcMapping arrayJdbcMapping ;
49
53
private final JdbcParameter jdbcParameter ;
50
54
private final SelectStatement sqlSelect ;
@@ -66,16 +70,18 @@ public CollectionBatchLoaderArrayParam(
66
70
}
67
71
68
72
final ForeignKeyDescriptor keyDescriptor = getLoadable ().getKeyDescriptor ();
69
- final Class <?> keyType = keyDescriptor .getJavaType ().getJavaTypeClass ();
70
- final Class <?> arrayClass = Array .newInstance ( keyType , 0 ).getClass ();
73
+ final JdbcMapping jdbcMapping = keyDescriptor .getSingleJdbcMapping ();
74
+ final Class <?> jdbcArrayClass = Array .newInstance ( jdbcMapping .getJdbcJavaType ().getJavaTypeClass (), 0 )
75
+ .getClass ();
76
+ keyDomainType = getKeyType ( keyDescriptor .getKeyPart () );
71
77
72
78
final BasicType <?> arrayBasicType = getSessionFactory ().getTypeConfiguration ()
73
79
.getBasicTypeRegistry ()
74
- .getRegisteredType ( arrayClass );
80
+ .getRegisteredType ( jdbcArrayClass );
75
81
arrayJdbcMapping = MultiKeyLoadHelper .resolveArrayJdbcMapping (
76
82
arrayBasicType ,
77
- keyDescriptor . getSingleJdbcMapping () ,
78
- arrayClass ,
83
+ jdbcMapping ,
84
+ jdbcArrayClass ,
79
85
getSessionFactory ()
80
86
);
81
87
@@ -95,7 +101,6 @@ public CollectionBatchLoaderArrayParam(
95
101
.buildSelectTranslator ( getSessionFactory (), sqlSelect )
96
102
.translate ( JdbcParameterBindings .NO_BINDINGS , QueryOptions .NONE );
97
103
}
98
-
99
104
@ Override
100
105
public PersistentCollection <?> load (Object keyBeingLoaded , SharedSessionContractImplementor session ) {
101
106
final ForeignKeyDescriptor keyDescriptor = getLoadable ().getKeyDescriptor ();
@@ -122,13 +127,14 @@ private PersistentCollection<?> loadEmbeddable(
122
127
123
128
final int length = getDomainBatchSize ();
124
129
final Object [] keysToInitialize = (Object []) Array .newInstance (
125
- keyDescriptor . getSingleJdbcMapping (). getJdbcJavaType (). getJavaTypeClass (),
126
- length
127
- );
128
- final Object [] embeddedKeys = ( Object []) Array . newInstance (
129
- keyDescriptor . getJavaType (). getJavaTypeClass (),
130
+ jdbcParameter . getExpressionType ()
131
+ . getSingleJdbcMapping ()
132
+ . getJdbcJavaType ()
133
+ . getJavaTypeClass ()
134
+ . getComponentType (),
130
135
length
131
136
);
137
+ final Object [] embeddedKeys = (Object []) Array .newInstance ( keyDomainType , length );
132
138
session .getPersistenceContextInternal ().getBatchFetchQueue ()
133
139
.collectBatchLoadableCollectionKeys (
134
140
length ,
@@ -157,7 +163,7 @@ private PersistentCollection<?> loadEmbeddable(
157
163
}
158
164
final CollectionKey collectionKey = new CollectionKey (
159
165
getLoadable ().getCollectionDescriptor (),
160
- keysToInitialize
166
+ keyBeingLoaded
161
167
);
162
168
return session .getPersistenceContext ().getCollection ( collectionKey );
163
169
}
0 commit comments