11
11
import java .util .Calendar ;
12
12
import java .util .Collection ;
13
13
import java .util .Date ;
14
- import java .util .IdentityHashMap ;
15
14
import java .util .List ;
16
15
import java .util .Map ;
17
16
import java .util .Optional ;
@@ -128,36 +127,62 @@ protected TupleMetadata buildTupleMetadata(SqmStatement<?> statement, Class<R> r
128
127
129
128
private TupleMetadata getTupleMetadata (List <SqmSelection <?>> selections ) {
130
129
if ( getQueryOptions ().getTupleTransformer () == null ) {
131
- return new TupleMetadata ( buildTupleElementMap ( selections ) );
130
+ return new TupleMetadata ( buildTupleElementArray ( selections ), buildTupleAliasArray ( selections ) );
132
131
}
133
132
else {
134
133
throw new IllegalArgumentException (
135
- "Illegal combination of Tuple resultType and (non-JpaTupleBuilder) TupleTransformer : " +
136
- getQueryOptions ().getTupleTransformer ()
134
+ "Illegal combination of Tuple resultType and (non-JpaTupleBuilder) TupleTransformer: "
135
+ + getQueryOptions ().getTupleTransformer ()
137
136
);
138
137
}
139
138
}
140
139
141
- private static Map <TupleElement <?>, Integer > buildTupleElementMap (List <SqmSelection <?>> selections ) {
142
- final Map <TupleElement <?>, Integer > tupleElementMap ;
143
- if ( selections .size () == 1
144
- && selections .get ( 0 ).getSelectableNode () instanceof CompoundSelection <?> ) {
145
- final List <? extends JpaSelection <?>> selectionItems =
146
- selections .get ( 0 ).getSelectableNode ()
147
- .getSelectionItems ();
148
- tupleElementMap = new IdentityHashMap <>( selectionItems .size () );
149
- for ( int i = 0 ; i < selectionItems .size (); i ++ ) {
150
- tupleElementMap .put ( selectionItems .get ( i ), i );
140
+ private static TupleElement <?>[] buildTupleElementArray (List <SqmSelection <?>> selections ) {
141
+ final TupleElement <?>[] elements ;
142
+ if ( selections .size () == 1 ) {
143
+ final SqmSelectableNode <?> selectableNode = selections .get (0 ).getSelectableNode ();
144
+ if ( selectableNode instanceof CompoundSelection <?> ) {
145
+ final List <? extends JpaSelection <?>> selectionItems = selectableNode .getSelectionItems ();
146
+ elements = new TupleElement <?>[ selectionItems .size () ];
147
+ for ( int i = 0 ; i < selectionItems .size (); i ++ ) {
148
+ elements [i ] = selectionItems .get ( i );
149
+ }
150
+ }
151
+ else {
152
+ elements = new TupleElement <?>[] { selectableNode };
153
+ }
154
+ }
155
+ else {
156
+ elements = new TupleElement <?>[ selections .size () ];
157
+ for ( int i = 0 ; i < selections .size (); i ++ ) {
158
+ elements [i ] = selections .get (i ).getSelectableNode ();
159
+ }
160
+ }
161
+ return elements ;
162
+ }
163
+
164
+ private static String [] buildTupleAliasArray (List <SqmSelection <?>> selections ) {
165
+ final String [] elements ;
166
+ if ( selections .size () == 1 ) {
167
+ final SqmSelectableNode <?> selectableNode = selections .get (0 ).getSelectableNode ();
168
+ if ( selectableNode instanceof CompoundSelection <?> ) {
169
+ final List <? extends JpaSelection <?>> selectionItems = selectableNode .getSelectionItems ();
170
+ elements = new String [ selectionItems .size () ];
171
+ for ( int i = 0 ; i < selectionItems .size (); i ++ ) {
172
+ elements [i ] = selectionItems .get ( i ).getAlias ();
173
+ }
174
+ }
175
+ else {
176
+ elements = new String [] { selectableNode .getAlias () };
151
177
}
152
178
}
153
179
else {
154
- tupleElementMap = new IdentityHashMap <>( selections .size () );
155
- for (int i = 0 ; i < selections .size (); i ++ ) {
156
- final SqmSelection <?> selection = selections .get ( i );
157
- tupleElementMap .put ( selection .getSelectableNode (), i );
180
+ elements = new String [ selections .size () ];
181
+ for ( int i = 0 ; i < selections .size (); i ++ ) {
182
+ elements [i ] = selections .get (i ).getAlias ();
158
183
}
159
184
}
160
- return tupleElementMap ;
185
+ return elements ;
161
186
}
162
187
163
188
protected void applyOptions (NamedSqmQueryMemento memento ) {
@@ -173,10 +198,12 @@ protected void applyOptions(NamedSqmQueryMemento memento) {
173
198
174
199
if ( memento .getParameterTypes () != null ) {
175
200
for ( Map .Entry <String , String > entry : memento .getParameterTypes ().entrySet () ) {
176
- final QueryParameterImplementor <?> parameter = getParameterMetadata ().getQueryParameter ( entry .getKey () );
177
- final BasicType <?> type = getSessionFactory ().getTypeConfiguration ()
178
- .getBasicTypeRegistry ()
179
- .getRegisteredType ( entry .getValue () );
201
+ final QueryParameterImplementor <?> parameter =
202
+ getParameterMetadata ().getQueryParameter ( entry .getKey () );
203
+ final BasicType <?> type =
204
+ getSessionFactory ().getTypeConfiguration ()
205
+ .getBasicTypeRegistry ()
206
+ .getRegisteredType ( entry .getValue () );
180
207
parameter .applyAnticipatedType ( type );
181
208
}
182
209
}
0 commit comments