2020import org .hibernate .query .specification .SelectionSpecification ;
2121import org .hibernate .query .restriction .Path ;
2222import org .hibernate .query .restriction .Restriction ;
23- import org .hibernate .query .spi .HqlInterpretation ;
2423import org .hibernate .query .spi .QueryEngine ;
2524import org .hibernate .query .sqm .NodeBuilder ;
2625import org .hibernate .query .sqm .SqmQuerySource ;
2726import org .hibernate .query .sqm .internal .SqmSelectionQueryImpl ;
2827import org .hibernate .query .sqm .internal .SqmUtil ;
2928import org .hibernate .query .sqm .tree .from .SqmRoot ;
30- import org .hibernate .query .sqm .tree .predicate .SqmPredicate ;
3129import org .hibernate .query .sqm .tree .select .SqmOrderByClause ;
32- import org .hibernate .query .sqm .tree .select .SqmSelectClause ;
3330import 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 ;
3631import org .hibernate .type .descriptor .java .JavaType ;
3732
3833import java .util .ArrayList ;
3934import java .util .Collections ;
4035import java .util .List ;
4136import java .util .Locale ;
4237import java .util .Map ;
43- import java .util .Set ;
4438import java .util .function .BiConsumer ;
4539
4640import static org .hibernate .internal .util .collections .CollectionHelper .isEmpty ;
4741import static org .hibernate .query .sqm .internal .SqmUtil .validateCriteriaQuery ;
4842import static org .hibernate .query .sqm .tree .SqmCopyContext .noParamCopyContext ;
4943
5044/**
51- * Standard implementation of SelectionSpecification
45+ * Standard implementation of {@link SelectionSpecification}.
5246 *
5347 * @author Steve Ebersole
5448 */
@@ -99,7 +93,7 @@ public TypedQueryReference<T> reference() {
9993 @ Override
10094 public SelectionSpecification <T > restrict (Restriction <? super T > restriction ) {
10195 specifications .add ( (sqmStatement , root ) -> {
102- final SqmPredicate sqmPredicate = SqmUtil .restriction ( sqmStatement , resultType , restriction );
96+ final var sqmPredicate = SqmUtil .restriction ( sqmStatement , resultType , restriction );
10397 sqmStatement .getQuerySpec ().applyPredicate ( sqmPredicate );
10498 } );
10599 return this ;
@@ -145,7 +139,7 @@ public final SelectionSpecification<T> resort(List<? extends Order<? super T>> o
145139 }
146140
147141 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 );
149143 final var querySpec = sqmStatement .getQuerySpec ();
150144 if ( querySpec .getOrderByClause () == null ) {
151145 querySpec .setOrderByClause ( new SqmOrderByClause () );
@@ -165,7 +159,7 @@ public SelectionQuery<T> createQuery(StatelessSession session) {
165159
166160 public SelectionQuery <T > createQuery (SharedSessionContract session ) {
167161 final var sessionImpl = session .unwrap (SharedSessionContractImplementor .class );
168- final SqmSelectStatement < T > sqmStatement = build ( sessionImpl .getFactory ().getQueryEngine () );
162+ final var sqmStatement = build ( sessionImpl .getFactory ().getQueryEngine () );
169163 return new SqmSelectionQueryImpl <>( sqmStatement , true , resultType , sessionImpl );
170164 }
171165
@@ -199,13 +193,13 @@ public SelectionQuery<T> createQuery(EntityManager entityManager) {
199193
200194 @ Override
201195 public CriteriaQuery <T > buildCriteria (CriteriaBuilder builder ) {
202- final NodeBuilder nodeBuilder = (NodeBuilder ) builder ;
196+ final var nodeBuilder = (NodeBuilder ) builder ;
203197 return build ( nodeBuilder .getQueryEngine () );
204198 }
205199
206200 @ Override
207201 public SelectionSpecification <T > validate (CriteriaBuilder builder ) {
208- final NodeBuilder nodeBuilder = (NodeBuilder ) builder ;
202+ final var nodeBuilder = (NodeBuilder ) builder ;
209203 final var statement = build ( nodeBuilder .getQueryEngine () );
210204 final var queryPart = statement .getQueryPart ();
211205 // For criteria queries, we have to validate the fetch structure here
@@ -220,7 +214,7 @@ public SelectionSpecification<T> validate(CriteriaBuilder builder) {
220214 * and produce the corresponding SQM tree.
221215 */
222216 private static <T > SqmSelectStatement <T > resolveSqmTree (String hql , Class <T > resultType , QueryEngine queryEngine ) {
223- final HqlInterpretation < T > hqlInterpretation =
217+ final var hqlInterpretation =
224218 queryEngine .getInterpretationCache ()
225219 .resolveHqlInterpretation ( hql , resultType , queryEngine .getHqlTranslator () );
226220
@@ -231,25 +225,25 @@ private static <T> SqmSelectStatement<T> resolveSqmTree(String hql, Class<T> res
231225
232226 // NOTE: this copy is to isolate the actual AST tree from the
233227 // 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 ) );
237231 }
238232
239233 /**
240- * Used during construction. Mainly used to group extracting and
234+ * Used during construction. Mainly used to group extracting and
241235 * validating the root.
242236 */
243237 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 ();
245239 if ( sqmRoots .isEmpty () ) {
246240 throw new QueryException ( "Query did not define any roots" , hql );
247241 }
248242 if ( sqmRoots .size () > 1 ) {
249243 throw new QueryException ( "Query defined multiple roots" , hql );
250244 }
251245
252- final SqmRoot <?> sqmRoot = sqmRoots .iterator ().next ();
246+ final var sqmRoot = sqmRoots .iterator ().next ();
253247 validateRoot ( sqmRoot , resultType , hql );
254248 // for later, to support select lists
255249 //validateResultType( sqmStatement, sqmRoot, resultType, hql );
@@ -259,14 +253,15 @@ private SqmRoot<T> extractRoot(SqmSelectStatement<T> sqmStatement, Class<T> resu
259253 }
260254
261255 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 ) ) {
265260 throw new QueryException (
266261 String .format (
267262 Locale .ROOT ,
268263 "Query root [%s] and result type [%s] are not compatible" ,
269- sqmRoot . getJavaType () .getName (),
264+ javaType .getName (),
270265 resultType .getName ()
271266 ),
272267 hql
@@ -297,8 +292,8 @@ private void validateResultType(
297292 }
298293 }
299294
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 ();
302297 if ( isEmpty ( sqmSelections ) ) {
303298 // implicit select clause, verify that resultType matches the root type
304299 if ( resultType .isAssignableFrom ( rootJavaType ) ) {
0 commit comments