20
20
import org .hibernate .query .specification .SelectionSpecification ;
21
21
import org .hibernate .query .restriction .Path ;
22
22
import org .hibernate .query .restriction .Restriction ;
23
- import org .hibernate .query .spi .HqlInterpretation ;
24
23
import org .hibernate .query .spi .QueryEngine ;
25
24
import org .hibernate .query .sqm .NodeBuilder ;
26
25
import org .hibernate .query .sqm .SqmQuerySource ;
27
26
import org .hibernate .query .sqm .internal .SqmSelectionQueryImpl ;
28
27
import org .hibernate .query .sqm .internal .SqmUtil ;
29
28
import org .hibernate .query .sqm .tree .from .SqmRoot ;
30
- import org .hibernate .query .sqm .tree .predicate .SqmPredicate ;
31
29
import org .hibernate .query .sqm .tree .select .SqmOrderByClause ;
32
- import org .hibernate .query .sqm .tree .select .SqmSelectClause ;
33
30
import org .hibernate .query .sqm .tree .select .SqmSelectStatement ;
34
- import org .hibernate .query .sqm .tree .select .SqmSelection ;
35
- import org .hibernate .query .sqm .tree .select .SqmSortSpecification ;
36
31
import org .hibernate .type .descriptor .java .JavaType ;
37
32
38
33
import java .util .ArrayList ;
39
34
import java .util .Collections ;
40
35
import java .util .List ;
41
36
import java .util .Locale ;
42
37
import java .util .Map ;
43
- import java .util .Set ;
44
38
import java .util .function .BiConsumer ;
45
39
46
40
import static org .hibernate .internal .util .collections .CollectionHelper .isEmpty ;
47
41
import static org .hibernate .query .sqm .internal .SqmUtil .validateCriteriaQuery ;
48
42
import static org .hibernate .query .sqm .tree .SqmCopyContext .noParamCopyContext ;
49
43
50
44
/**
51
- * Standard implementation of SelectionSpecification
45
+ * Standard implementation of {@link SelectionSpecification}.
52
46
*
53
47
* @author Steve Ebersole
54
48
*/
@@ -99,7 +93,7 @@ public TypedQueryReference<T> reference() {
99
93
@ Override
100
94
public SelectionSpecification <T > restrict (Restriction <? super T > restriction ) {
101
95
specifications .add ( (sqmStatement , root ) -> {
102
- final SqmPredicate sqmPredicate = SqmUtil .restriction ( sqmStatement , resultType , restriction );
96
+ final var sqmPredicate = SqmUtil .restriction ( sqmStatement , resultType , restriction );
103
97
sqmStatement .getQuerySpec ().applyPredicate ( sqmPredicate );
104
98
} );
105
99
return this ;
@@ -145,7 +139,7 @@ public final SelectionSpecification<T> resort(List<? extends Order<? super T>> o
145
139
}
146
140
147
141
private static <T > void addOrder (Order <? super T > order , SqmSelectStatement <T > sqmStatement ) {
148
- final SqmSortSpecification sortSpecification = SqmUtil .sortSpecification ( sqmStatement , order );
142
+ final var sortSpecification = SqmUtil .sortSpecification ( sqmStatement , order );
149
143
final var querySpec = sqmStatement .getQuerySpec ();
150
144
if ( querySpec .getOrderByClause () == null ) {
151
145
querySpec .setOrderByClause ( new SqmOrderByClause () );
@@ -165,7 +159,7 @@ public SelectionQuery<T> createQuery(StatelessSession session) {
165
159
166
160
public SelectionQuery <T > createQuery (SharedSessionContract session ) {
167
161
final var sessionImpl = session .unwrap (SharedSessionContractImplementor .class );
168
- final SqmSelectStatement < T > sqmStatement = build ( sessionImpl .getFactory ().getQueryEngine () );
162
+ final var sqmStatement = build ( sessionImpl .getFactory ().getQueryEngine () );
169
163
return new SqmSelectionQueryImpl <>( sqmStatement , true , resultType , sessionImpl );
170
164
}
171
165
@@ -199,13 +193,13 @@ public SelectionQuery<T> createQuery(EntityManager entityManager) {
199
193
200
194
@ Override
201
195
public CriteriaQuery <T > buildCriteria (CriteriaBuilder builder ) {
202
- final NodeBuilder nodeBuilder = (NodeBuilder ) builder ;
196
+ final var nodeBuilder = (NodeBuilder ) builder ;
203
197
return build ( nodeBuilder .getQueryEngine () );
204
198
}
205
199
206
200
@ Override
207
201
public SelectionSpecification <T > validate (CriteriaBuilder builder ) {
208
- final NodeBuilder nodeBuilder = (NodeBuilder ) builder ;
202
+ final var nodeBuilder = (NodeBuilder ) builder ;
209
203
final var statement = build ( nodeBuilder .getQueryEngine () );
210
204
final var queryPart = statement .getQueryPart ();
211
205
// For criteria queries, we have to validate the fetch structure here
@@ -220,7 +214,7 @@ public SelectionSpecification<T> validate(CriteriaBuilder builder) {
220
214
* and produce the corresponding SQM tree.
221
215
*/
222
216
private static <T > SqmSelectStatement <T > resolveSqmTree (String hql , Class <T > resultType , QueryEngine queryEngine ) {
223
- final HqlInterpretation < T > hqlInterpretation =
217
+ final var hqlInterpretation =
224
218
queryEngine .getInterpretationCache ()
225
219
.resolveHqlInterpretation ( hql , resultType , queryEngine .getHqlTranslator () );
226
220
@@ -231,25 +225,25 @@ private static <T> SqmSelectStatement<T> resolveSqmTree(String hql, Class<T> res
231
225
232
226
// NOTE: this copy is to isolate the actual AST tree from the
233
227
// one stored in the interpretation cache
234
- return (SqmSelectStatement <T >) hqlInterpretation
235
- .getSqmStatement ()
236
- .copy ( noParamCopyContext ( SqmQuerySource .CRITERIA ) );
228
+ return (SqmSelectStatement <T >)
229
+ hqlInterpretation .getSqmStatement ()
230
+ .copy ( noParamCopyContext ( SqmQuerySource .CRITERIA ) );
237
231
}
238
232
239
233
/**
240
- * Used during construction. Mainly used to group extracting and
234
+ * Used during construction. Mainly used to group extracting and
241
235
* validating the root.
242
236
*/
243
237
private SqmRoot <T > extractRoot (SqmSelectStatement <T > sqmStatement , Class <T > resultType , String hql ) {
244
- final Set < SqmRoot <?>> sqmRoots = sqmStatement .getQuerySpec ().getRoots ();
238
+ final var sqmRoots = sqmStatement .getQuerySpec ().getRoots ();
245
239
if ( sqmRoots .isEmpty () ) {
246
240
throw new QueryException ( "Query did not define any roots" , hql );
247
241
}
248
242
if ( sqmRoots .size () > 1 ) {
249
243
throw new QueryException ( "Query defined multiple roots" , hql );
250
244
}
251
245
252
- final SqmRoot <?> sqmRoot = sqmRoots .iterator ().next ();
246
+ final var sqmRoot = sqmRoots .iterator ().next ();
253
247
validateRoot ( sqmRoot , resultType , hql );
254
248
// for later, to support select lists
255
249
//validateResultType( sqmStatement, sqmRoot, resultType, hql );
@@ -259,14 +253,15 @@ private SqmRoot<T> extractRoot(SqmSelectStatement<T> sqmStatement, Class<T> resu
259
253
}
260
254
261
255
private void validateRoot (SqmRoot <?> sqmRoot , Class <T > resultType , String hql ) {
262
- if ( sqmRoot .getJavaType () != null
263
- && !Map .class .isAssignableFrom ( sqmRoot .getJavaType () )
264
- && !resultType .isAssignableFrom ( sqmRoot .getJavaType () ) ) {
256
+ final var javaType = sqmRoot .getJavaType ();
257
+ if ( javaType != null
258
+ && !Map .class .isAssignableFrom ( javaType )
259
+ && !resultType .isAssignableFrom ( javaType ) ) {
265
260
throw new QueryException (
266
261
String .format (
267
262
Locale .ROOT ,
268
263
"Query root [%s] and result type [%s] are not compatible" ,
269
- sqmRoot . getJavaType () .getName (),
264
+ javaType .getName (),
270
265
resultType .getName ()
271
266
),
272
267
hql
@@ -297,8 +292,8 @@ private void validateResultType(
297
292
}
298
293
}
299
294
300
- final SqmSelectClause sqmSelectClause = sqmStatement .getQuerySpec ().getSelectClause ();
301
- final List < SqmSelection <?>> sqmSelections = sqmSelectClause .getSelections ();
295
+ final var sqmSelectClause = sqmStatement .getQuerySpec ().getSelectClause ();
296
+ final var sqmSelections = sqmSelectClause .getSelections ();
302
297
if ( isEmpty ( sqmSelections ) ) {
303
298
// implicit select clause, verify that resultType matches the root type
304
299
if ( resultType .isAssignableFrom ( rootJavaType ) ) {
0 commit comments