From 03cbfed822e9d83135cce40b964496718e3ddcc7 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Fri, 31 Oct 2025 13:57:57 +0100 Subject: [PATCH 1/2] Apply null annotations in org.hibernate.query.sqm.tree --- checkerstubs/jakarta.persistence.astub | 34 ++-- checkerstubs/jboss.logging.astub | 10 + .../java/org/hibernate/QueryException.java | 10 +- .../dialect/function/DateTruncEmulation.java | 8 +- ...yViaElementArgumentReturnTypeResolver.java | 25 ++- .../spi/AbstractParameterDescriptor.java | 18 +- .../hibernate/internal/CoreMessageLogger.java | 4 +- .../model/domain/IdentifiableDomainType.java | 11 +- .../model/domain/ManagedDomainType.java | 23 +-- .../metamodel/model/domain/PathSource.java | 5 +- .../AbstractDiscriminatorSqmPathSource.java | 3 +- .../internal/AbstractIdentifiableType.java | 15 +- .../domain/internal/AbstractManagedType.java | 25 +-- .../internal/AbstractPluralAttribute.java | 9 +- .../internal/AbstractSqmPathSource.java | 3 +- .../internal/AnyDiscriminatorSqmPath.java | 10 +- .../AnyDiscriminatorSqmPathSource.java | 6 +- .../internal/AnyMappingDomainTypeImpl.java | 3 +- .../internal/AnyMappingSqmPathSource.java | 5 +- .../model/domain/internal/ArrayTupleType.java | 3 +- .../domain/internal/BagAttributeImpl.java | 3 +- .../domain/internal/BasicSqmPathSource.java | 9 +- .../model/domain/internal/BasicTypeImpl.java | 3 +- .../domain/internal/EmbeddableTypeImpl.java | 5 +- .../EmbeddedDiscriminatorSqmPath.java | 10 +- .../EmbeddedDiscriminatorSqmPathSource.java | 3 +- .../internal/EmbeddedSqmPathSource.java | 7 +- .../internal/EntityDiscriminatorSqmPath.java | 10 +- .../EntityDiscriminatorSqmPathSource.java | 3 +- .../domain/internal/EntitySqmPathSource.java | 9 +- .../model/domain/internal/EntityTypeImpl.java | 14 +- .../domain/internal/ListAttributeImpl.java | 7 +- .../domain/internal/MapAttributeImpl.java | 7 +- .../MappedSuperclassSqmPathSource.java | 7 +- .../internal/MappedSuperclassTypeImpl.java | 12 +- .../domain/internal/MappingMetamodelImpl.java | 4 +- .../NonAggregatedCompositeSqmPathSource.java | 5 +- .../model/domain/internal/PathHelper.java | 3 +- .../domain/internal/SetAttributeImpl.java | 3 +- .../internal/SingularAttributeImpl.java | 16 +- .../org/hibernate/query/QueryParameter.java | 3 +- .../hibernate/query/SemanticException.java | 7 +- .../query/criteria/CriteriaDefinition.java | 7 +- .../criteria/HibernateCriteriaBuilder.java | 5 +- .../hibernate/query/criteria/JpaCoalesce.java | 3 +- .../query/criteria/JpaCollectionJoin.java | 9 +- .../criteria/JpaConflictUpdateAction.java | 13 +- .../query/criteria/JpaCriteriaBase.java | 3 +- .../criteria/JpaCriteriaInsertSelect.java | 3 +- .../query/criteria/JpaCriteriaQuery.java | 21 ++- .../query/criteria/JpaCriteriaUpdate.java | 11 +- .../query/criteria/JpaCteContainer.java | 3 +- .../query/criteria/JpaCteCriteria.java | 15 +- .../criteria/JpaCteCriteriaAttribute.java | 3 +- .../query/criteria/JpaCteCriteriaType.java | 5 +- .../query/criteria/JpaDerivedJoin.java | 9 +- .../query/criteria/JpaFunctionJoin.java | 9 +- .../query/criteria/JpaInPredicate.java | 3 +- .../org/hibernate/query/criteria/JpaJoin.java | 11 +- .../hibernate/query/criteria/JpaListJoin.java | 9 +- .../hibernate/query/criteria/JpaMapJoin.java | 9 +- .../org/hibernate/query/criteria/JpaPath.java | 5 +- .../query/criteria/JpaPluralJoin.java | 12 +- .../query/criteria/JpaQueryPart.java | 9 +- .../query/criteria/JpaQueryStructure.java | 17 +- .../query/criteria/JpaSelectCriteria.java | 15 +- .../hibernate/query/criteria/JpaSetJoin.java | 9 +- .../hibernate/query/criteria/JpaSubQuery.java | 15 +- .../query/criteria/JpaWindowFrame.java | 3 +- .../NamedCriteriaQueryMementoImpl.java | 2 +- .../spi/HibernateCriteriaBuilderDelegate.java | 5 +- .../hql/internal/SemanticQueryBuilder.java | 91 ++++----- .../hql/internal/SqmPathRegistryImpl.java | 28 ++- .../query/hql/spi/SqmPathRegistry.java | 20 +- .../hibernate/query/internal/QueryHelper.java | 11 +- .../internal/QueryParameterBindingImpl.java | 25 ++- .../QueryParameterIdentifiedImpl.java | 3 +- .../internal/QueryParameterNamedImpl.java | 3 +- .../QueryParameterPositionalImpl.java | 3 +- .../spi/AbstractCommonQueryContract.java | 5 +- .../query/spi/AbstractQueryParameter.java | 7 +- .../query/spi/QueryParameterBinding.java | 11 +- .../QueryParameterBindingTypeResolver.java | 5 +- .../query/sqm/DiscriminatorSqmPath.java | 14 +- .../org/hibernate/query/sqm/NodeBuilder.java | 3 +- .../query/sqm/SemanticQueryWalker.java | 5 +- .../hibernate/query/sqm/SqmExpressible.java | 3 +- .../org/hibernate/query/sqm/SqmJoinable.java | 5 +- .../hibernate/query/sqm/SqmPathSource.java | 14 +- .../SelfRenderingSqmSetReturningFunction.java | 16 +- .../sqm/function/SqmFunctionDescriptor.java | 13 +- .../sqm/function/SqmFunctionRegistry.java | 27 +++ .../sqm/internal/SqmCriteriaNodeBuilder.java | 96 +++++----- .../query/sqm/internal/SqmPathVisitor.java | 3 +- .../query/sqm/internal/SqmTreePrinter.java | 5 +- .../hibernate/query/sqm/internal/SqmUtil.java | 21 +-- .../query/sqm/internal/TypecheckUtil.java | 9 +- .../MultiTableSqmMutationConverter.java | 3 +- .../function/FunctionReturnTypeResolver.java | 4 +- .../StandardFunctionReturnTypeResolvers.java | 3 +- .../sqm/spi/BaseSemanticQueryWalker.java | 7 +- .../query/sqm/spi/SqmCreationHelper.java | 9 +- .../sqm/sql/BaseSqmToSqlAstConverter.java | 8 +- .../EntityValuedPathInterpretation.java | 2 +- .../sqm/tree/AbstractSqmDmlStatement.java | 8 +- .../AbstractSqmRestrictedDmlStatement.java | 46 ++--- .../query/sqm/tree/AbstractSqmStatement.java | 7 +- .../query/sqm/tree/SqmCacheable.java | 16 +- .../sqm/tree/SqmExpressibleAccessor.java | 5 +- .../hibernate/query/sqm/tree/SqmJoinType.java | 2 +- .../query/sqm/tree/SqmTypedNode.java | 3 +- .../query/sqm/tree/cte/SqmCteContainer.java | 3 +- .../query/sqm/tree/cte/SqmCteStatement.java | 67 ++++--- .../query/sqm/tree/cte/SqmCteTable.java | 24 ++- .../query/sqm/tree/cte/SqmCteTableColumn.java | 5 +- .../cte/SqmSearchClauseSpecification.java | 3 +- .../sqm/tree/delete/SqmDeleteStatement.java | 9 +- .../tree/domain/AbstractSqmAttributeJoin.java | 38 ++-- .../sqm/tree/domain/AbstractSqmFrom.java | 56 +++--- .../sqm/tree/domain/AbstractSqmJoin.java | 59 ++---- .../sqm/tree/domain/AbstractSqmPath.java | 94 ++++++---- .../tree/domain/AbstractSqmPluralJoin.java | 5 +- .../tree/domain/AbstractSqmSimplePath.java | 25 ++- .../AbstractSqmSpecificPluralPartPath.java | 37 +++- .../NonAggregatedCompositeSimplePath.java | 14 +- .../tree/domain/SqmAnyValuedSimplePath.java | 28 ++- .../query/sqm/tree/domain/SqmBagJoin.java | 24 +-- .../tree/domain/SqmBasicValuedSimplePath.java | 51 +++-- .../sqm/tree/domain/SqmCorrelatedBagJoin.java | 3 +- .../tree/domain/SqmCorrelatedCrossJoin.java | 9 +- .../sqm/tree/domain/SqmCorrelatedCteJoin.java | 3 +- .../tree/domain/SqmCorrelatedDerivedJoin.java | 3 +- .../tree/domain/SqmCorrelatedDerivedRoot.java | 5 +- .../domain/SqmCorrelatedDerivedRootJoin.java | 12 +- .../tree/domain/SqmCorrelatedEntityJoin.java | 9 +- .../tree/domain/SqmCorrelatedListJoin.java | 3 +- .../sqm/tree/domain/SqmCorrelatedMapJoin.java | 3 +- .../sqm/tree/domain/SqmCorrelatedRoot.java | 5 +- .../tree/domain/SqmCorrelatedRootJoin.java | 7 +- .../sqm/tree/domain/SqmCorrelatedSetJoin.java | 3 +- .../domain/SqmCorrelatedSingularJoin.java | 3 +- .../query/sqm/tree/domain/SqmCteRoot.java | 10 +- .../query/sqm/tree/domain/SqmDerivedRoot.java | 27 +-- .../domain/SqmElementAggregateFunction.java | 30 +-- .../tree/domain/SqmEmbeddableDomainType.java | 3 +- .../domain/SqmEmbeddedValuedSimplePath.java | 15 +- .../sqm/tree/domain/SqmEntityDomainType.java | 3 +- .../domain/SqmEntityValuedSimplePath.java | 8 +- .../sqm/tree/domain/SqmFkExpression.java | 10 +- .../sqm/tree/domain/SqmFunctionPath.java | 13 +- .../sqm/tree/domain/SqmFunctionRoot.java | 38 +--- .../domain/SqmIndexAggregateFunction.java | 30 +-- .../SqmIndexedCollectionAccessPath.java | 20 +- .../query/sqm/tree/domain/SqmListJoin.java | 24 +-- .../sqm/tree/domain/SqmManagedDomainType.java | 21 ++- .../sqm/tree/domain/SqmMapEntryReference.java | 6 +- .../query/sqm/tree/domain/SqmMapJoin.java | 24 +-- .../domain/SqmMappedSuperclassDomainType.java | 3 +- .../query/sqm/tree/domain/SqmPath.java | 16 +- .../sqm/tree/domain/SqmPluralPartJoin.java | 28 ++- .../domain/SqmPluralValuedSimplePath.java | 22 ++- .../domain/SqmPolymorphicRootDescriptor.java | 47 ++--- .../query/sqm/tree/domain/SqmSetJoin.java | 25 +-- .../sqm/tree/domain/SqmSingularJoin.java | 18 +- .../tree/domain/SqmTreatableDomainType.java | 3 +- .../sqm/tree/domain/SqmTreatedBagJoin.java | 31 +++- .../sqm/tree/domain/SqmTreatedCrossJoin.java | 64 +++++-- .../SqmTreatedEmbeddedValuedSimplePath.java | 18 +- .../sqm/tree/domain/SqmTreatedEntityJoin.java | 44 ++++- .../SqmTreatedEntityValuedSimplePath.java | 16 +- .../query/sqm/tree/domain/SqmTreatedFrom.java | 9 +- .../query/sqm/tree/domain/SqmTreatedJoin.java | 5 +- .../sqm/tree/domain/SqmTreatedListJoin.java | 35 ++-- .../sqm/tree/domain/SqmTreatedMapJoin.java | 38 ++-- .../tree/domain/SqmTreatedPluralPartJoin.java | 40 +--- .../query/sqm/tree/domain/SqmTreatedRoot.java | 17 +- .../sqm/tree/domain/SqmTreatedSetJoin.java | 31 +++- .../sqm/tree/domain/SqmTreatedSimplePath.java | 17 +- .../tree/domain/SqmTreatedSingularJoin.java | 38 ++-- .../expression/AbstractSqmExpression.java | 41 ----- .../AbstractSqmJsonPathExpression.java | 5 +- .../tree/expression/AbstractSqmParameter.java | 12 +- .../expression/AsWrapperSqmExpression.java | 12 +- .../sqm/tree/expression/Compatibility.java | 6 +- .../tree/expression/JpaCriteriaParameter.java | 25 +-- .../tree/expression/NullSqmExpressible.java | 41 ----- .../tree/expression/SqmAliasedNodeRef.java | 4 +- .../query/sqm/tree/expression/SqmAny.java | 4 +- .../expression/SqmAnyDiscriminatorValue.java | 3 +- .../tree/expression/SqmBinaryArithmetic.java | 9 +- .../query/sqm/tree/expression/SqmByUnit.java | 11 +- .../sqm/tree/expression/SqmCaseSearched.java | 19 +- .../sqm/tree/expression/SqmCaseSimple.java | 21 ++- .../sqm/tree/expression/SqmCastTarget.java | 22 +-- .../sqm/tree/expression/SqmCoalesce.java | 15 +- .../sqm/tree/expression/SqmCollation.java | 15 +- .../tree/expression/SqmCollectionSize.java | 11 +- .../sqm/tree/expression/SqmDistinct.java | 5 +- .../sqm/tree/expression/SqmDurationUnit.java | 7 +- .../sqm/tree/expression/SqmEnumLiteral.java | 15 +- .../query/sqm/tree/expression/SqmEvery.java | 4 +- .../sqm/tree/expression/SqmExpression.java | 37 +++- .../tree/expression/SqmExpressionHelper.java | 15 +- .../sqm/tree/expression/SqmExtractUnit.java | 6 +- .../sqm/tree/expression/SqmFieldLiteral.java | 174 ++---------------- .../query/sqm/tree/expression/SqmFormat.java | 13 ++ .../sqm/tree/expression/SqmFunction.java | 2 +- .../tree/expression/SqmHqlNumericLiteral.java | 10 +- .../SqmJpaCriteriaParameterWrapper.java | 13 +- .../expression/SqmJsonExistsExpression.java | 2 +- .../expression/SqmJsonQueryExpression.java | 2 +- .../tree/expression/SqmJsonTableFunction.java | 53 ++++-- .../expression/SqmJsonValueExpression.java | 12 +- .../query/sqm/tree/expression/SqmLiteral.java | 17 +- .../expression/SqmLiteralEmbeddableType.java | 5 +- .../tree/expression/SqmLiteralEntityType.java | 5 +- .../sqm/tree/expression/SqmLiteralNull.java | 13 +- .../SqmModifiedSubQueryExpression.java | 5 +- .../tree/expression/SqmNamedExpression.java | 3 +- .../tree/expression/SqmNamedParameter.java | 5 +- .../query/sqm/tree/expression/SqmOver.java | 2 +- .../sqm/tree/expression/SqmOverflow.java | 6 +- .../sqm/tree/expression/SqmParameter.java | 7 +- .../SqmParameterizedEntityType.java | 5 +- .../expression/SqmPositionalParameter.java | 8 +- .../SqmSelfRenderingExpression.java | 3 +- .../expression/SqmSetReturningFunction.java | 3 +- .../query/sqm/tree/expression/SqmStar.java | 3 +- .../sqm/tree/expression/SqmSummarization.java | 3 +- .../sqm/tree/expression/SqmToDuration.java | 14 +- .../tree/expression/SqmTrimSpecification.java | 5 +- .../query/sqm/tree/expression/SqmTuple.java | 7 +- .../tree/expression/SqmUnaryOperation.java | 9 +- .../query/sqm/tree/expression/SqmWindow.java | 24 +-- .../sqm/tree/expression/SqmWindowFrame.java | 20 +- .../SqmXmlAttributesExpression.java | 14 +- .../tree/expression/SqmXmlTableFunction.java | 35 +++- .../ValueBindJpaCriteriaParameter.java | 9 +- .../query/sqm/tree/from/SqmAttributeJoin.java | 32 ++-- .../query/sqm/tree/from/SqmCrossJoin.java | 54 +++--- .../query/sqm/tree/from/SqmCteJoin.java | 21 ++- .../query/sqm/tree/from/SqmDerivedJoin.java | 32 ++-- .../query/sqm/tree/from/SqmEntityJoin.java | 41 ++--- .../query/sqm/tree/from/SqmFrom.java | 7 +- .../query/sqm/tree/from/SqmFromClause.java | 55 ++++-- .../query/sqm/tree/from/SqmFunctionJoin.java | 35 ++-- .../query/sqm/tree/from/SqmJoin.java | 40 ++-- .../query/sqm/tree/from/SqmRoot.java | 52 +++--- .../tree/from/SqmTreatedAttributeJoin.java | 13 +- .../insert/AbstractSqmInsertStatement.java | 15 +- .../sqm/tree/insert/SqmConflictClause.java | 16 +- .../tree/insert/SqmConflictUpdateAction.java | 29 +-- .../tree/insert/SqmInsertSelectStatement.java | 22 ++- .../tree/insert/SqmInsertValuesStatement.java | 53 +++--- .../query/sqm/tree/insert/SqmValues.java | 3 +- .../sqm/tree/jpa/AbstractJpaTupleElement.java | 6 +- .../sqm/tree/jpa/ParameterCollector.java | 36 ++-- .../AbstractNegatableSqmPredicate.java | 3 +- .../tree/predicate/AbstractSqmPredicate.java | 29 ++- .../tree/predicate/SqmBetweenPredicate.java | 3 +- .../SqmBooleanExpressionPredicate.java | 16 +- .../predicate/SqmComparisonPredicate.java | 5 +- .../tree/predicate/SqmEmptinessPredicate.java | 3 +- .../tree/predicate/SqmExistsPredicate.java | 3 +- .../tree/predicate/SqmGroupedPredicate.java | 3 +- .../tree/predicate/SqmInListPredicate.java | 16 +- .../predicate/SqmInSubQueryPredicate.java | 6 +- .../tree/predicate/SqmJunctionPredicate.java | 7 +- .../sqm/tree/predicate/SqmLikePredicate.java | 2 +- .../tree/predicate/SqmMemberOfPredicate.java | 6 +- .../tree/predicate/SqmNegatedPredicate.java | 3 +- .../tree/predicate/SqmNullnessPredicate.java | 3 +- .../sqm/tree/predicate/SqmPredicate.java | 16 +- .../predicate/SqmPredicateCollection.java | 6 +- .../tree/predicate/SqmTruthnessPredicate.java | 3 +- .../sqm/tree/predicate/SqmWhereClause.java | 11 +- .../predicate/SqmWhereClauseContainer.java | 4 +- .../tree/select/AbstractSqmSelectQuery.java | 31 ++-- .../query/sqm/tree/select/SqmAliasedNode.java | 7 +- .../tree/select/SqmDynamicInstantiation.java | 72 +++++--- .../SqmDynamicInstantiationArgument.java | 9 +- .../tree/select/SqmJpaCompoundSelection.java | 7 +- .../sqm/tree/select/SqmOrderByClause.java | 7 +- .../query/sqm/tree/select/SqmQueryGroup.java | 15 +- .../query/sqm/tree/select/SqmQueryPart.java | 49 ++--- .../query/sqm/tree/select/SqmQuerySpec.java | 131 +++++++------ .../sqm/tree/select/SqmSelectClause.java | 9 +- .../sqm/tree/select/SqmSelectStatement.java | 57 +++--- .../sqm/tree/select/SqmSelectableNode.java | 7 +- .../query/sqm/tree/select/SqmSelection.java | 12 +- .../sqm/tree/select/SqmSortSpecification.java | 3 +- .../query/sqm/tree/select/SqmSubQuery.java | 150 +++++---------- .../query/sqm/tree/update/SqmAssignment.java | 3 +- .../query/sqm/tree/update/SqmSetClause.java | 3 +- .../sqm/tree/update/SqmUpdateStatement.java | 55 +++--- .../hibernate/query/sqm/tuple/TupleType.java | 3 +- .../AnonymousTupleSimpleSqmPathSource.java | 3 +- ...nonymousTupleSqmAssociationPathSource.java | 3 +- ...ymousTupleSqmAssociationPathSourceNew.java | 3 +- .../internal/AnonymousTupleSqmPathSource.java | 5 +- .../AnonymousTupleSqmPathSourceNew.java | 5 +- .../tuple/internal/AnonymousTupleType.java | 10 +- .../java/org/hibernate/spi/NavigablePath.java | 4 +- .../hibernate/spi/TreatedNavigablePath.java | 2 +- .../sql/ast/spi/SqlExpressionResolver.java | 3 +- .../internal/InstantiationHelper.java | 3 +- .../java/org/hibernate/type/BasicType.java | 3 +- .../org/hibernate/type/BasicTypeRegistry.java | 16 +- .../org/hibernate/type/BindingContext.java | 3 +- .../type/descriptor/java/JavaTypeHelper.java | 5 +- .../hibernate/type/spi/TypeConfiguration.java | 46 ++--- .../criteria/ManipulationCriteriaTest.java | 2 +- ...bqueryInSelectClauseJpaComplianceTest.java | 2 +- .../subquery/SubqueryInSelectClauseTest.java | 2 +- .../subquery/UncorrelatedSubqueryTest.java | 2 +- .../src/main/groovy/local.code-quality.gradle | 2 +- .../annotation/AnnotationMetaEntity.java | 7 +- .../annotation/NamedQueryMethod.java | 3 +- .../processor/util/SqmTypeUtils.java | 5 +- .../validation/MockSessionFactory.java | 14 +- 320 files changed, 2756 insertions(+), 2262 deletions(-) delete mode 100644 hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/NullSqmExpressible.java diff --git a/checkerstubs/jakarta.persistence.astub b/checkerstubs/jakarta.persistence.astub index ed7ee2d9ba8a..d7ad1c14c7a5 100644 --- a/checkerstubs/jakarta.persistence.astub +++ b/checkerstubs/jakarta.persistence.astub @@ -3,6 +3,7 @@ package jakarta.persistence; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.NonNull; public interface AttributeConverter { public @Nullable Y convertToDatabaseColumn(@Nullable X attribute); @@ -20,9 +21,10 @@ public interface EntityManagerFactory extends AutoCloseable { public interface EntityTransaction { @Nullable Integer getTimeout(); } -public interface Parameter { - public @Nullable String getName(); - public @Nullable Integer getPosition(); +public interface Parameter { + @Nullable String getName(); + @Nullable Integer getPosition(); + @Nullable Class getParameterType(); } public interface PersistenceUnitUtil extends PersistenceUtil { public @Nullable Object getIdentifier(Object entity); @@ -86,9 +88,9 @@ public interface CommonAbstractCriteria { } public interface AbstractQuery extends CommonAbstractCriteria { AbstractQuery where(@Nullable Expression restriction); - AbstractQuery where(@Nullable Predicate... restrictions); + AbstractQuery where(Predicate @Nullable... restrictions); AbstractQuery having(@Nullable Expression restriction); - AbstractQuery having(@Nullable Predicate... restrictions); + AbstractQuery having(Predicate @Nullable... restrictions); @Nullable Selection getSelection(); @Nullable Predicate getGroupRestriction(); } @@ -99,12 +101,18 @@ public interface CriteriaUpdate extends CommonAbstractCriteria { } public interface Subquery extends AbstractQuery, Expression { Subquery where(@Nullable Expression restriction); - Subquery where(@Nullable Predicate... restrictions); + Subquery where(Predicate @Nullable... restrictions); Subquery having(@Nullable Expression restriction); - Subquery having(@Nullable Predicate... restrictions); + Subquery having(Predicate @Nullable... restrictions); @Nullable Expression getSelection(); } public interface CriteriaBuilder { + interface In extends Predicate { + In value(@NonNull T value); + } + interface Coalesce extends Expression { + Coalesce value(@Nullable T value); + } public static interface SimpleCase extends Expression { SimpleCase when(C condition, @Nullable R result); SimpleCase when(Expression condition, @Nullable R result); @@ -117,26 +125,28 @@ public interface CriteriaBuilder { } public interface Join extends From { Join on(@Nullable Expression restriction); - Join on(@Nullable Predicate... restrictions); + Join on(Predicate @Nullable... restrictions); @Nullable Predicate getOn(); + @Nullable From getParent(); + @Nullable Attribute getAttribute(); } public interface SetJoin extends PluralJoin, E> { SetJoin on(@Nullable Expression restriction); - SetJoin on(@Nullable Predicate... restrictions); + SetJoin on(Predicate @Nullable... restrictions); } public interface ListJoin extends PluralJoin, E> { ListJoin on(@Nullable Expression restriction); - ListJoin on(@Nullable Predicate... restrictions); + ListJoin on(Predicate @Nullable... restrictions); } public interface MapJoin extends PluralJoin, V> { MapJoin on(@Nullable Expression restriction); - MapJoin on(@Nullable Predicate... restrictions); + MapJoin on(Predicate @Nullable... restrictions); } public interface Path extends Expression { // CteRoot etc. @Nullable Bindable getModel(); @Nullable Path getParentPath(); - MapJoin on(@Nullable Predicate... restrictions); + MapJoin on(Predicate @Nullable... restrictions); } package jakarta.persistence.metamodel; diff --git a/checkerstubs/jboss.logging.astub b/checkerstubs/jboss.logging.astub index c7a114536fab..6433dd129ff4 100644 --- a/checkerstubs/jboss.logging.astub +++ b/checkerstubs/jboss.logging.astub @@ -11,4 +11,14 @@ public interface BasicLogger { public interface Logger { void tracev(String format, @Nullable Object param1); void tracef(String format, @Nullable Object param1); + void tracev(String format, @Nullable Object param1, @Nullable Object param2); + void tracef(String format, @Nullable Object param1, @Nullable Object param2); + void warnv(String format, @Nullable Object param1); + void warnf(String format, @Nullable Object param1); + void warnv(String format, @Nullable Object param1, @Nullable Object param2); + void warnf(String format, @Nullable Object param1, @Nullable Object param2); + void debugv(String format, @Nullable Object param1); + void debugf(String format, @Nullable Object param1); + void debugv(String format, @Nullable Object param1, @Nullable Object param2); + void debugf(String format, @Nullable Object param1, @Nullable Object param2); } \ No newline at end of file diff --git a/hibernate-core/src/main/java/org/hibernate/QueryException.java b/hibernate-core/src/main/java/org/hibernate/QueryException.java index c7c9ba6a3ab4..e73c2bbc5f8a 100644 --- a/hibernate-core/src/main/java/org/hibernate/QueryException.java +++ b/hibernate-core/src/main/java/org/hibernate/QueryException.java @@ -4,6 +4,8 @@ */ package org.hibernate; +import org.checkerframework.checker.nullness.qual.Nullable; + /** * A problem occurred translating a Hibernate query to SQL due to illegal query * syntax, an operation which is not well-typed, an unresolvable reference to @@ -23,7 +25,7 @@ * @see org.hibernate.query.SyntaxException */ public class QueryException extends HibernateException { - private final String queryString; + private final @Nullable String queryString; /** * Constructs a {@code QueryException} using the specified exception message. @@ -58,7 +60,7 @@ public QueryException(String message, Exception cause) { * @param message A message explaining the exception condition * @param queryString The query being evaluated when the exception occurred */ - public QueryException(String message, String queryString) { + public QueryException(String message, @Nullable String queryString) { this( message, queryString, null ); } @@ -69,7 +71,7 @@ public QueryException(String message, String queryString) { * @param queryString The query being evaluated when the exception occurred * @param cause The underlying cause */ - public QueryException(String message, String queryString, Exception cause) { + public QueryException(String message, @Nullable String queryString, Exception cause) { super( message, cause ); this.queryString = queryString; } @@ -93,7 +95,7 @@ public QueryException(Exception cause) { * * @return The query string */ - public String getQueryString() { + public @Nullable String getQueryString() { return queryString; } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java index e0e39a3f0700..807f4d0c2a7b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java @@ -39,7 +39,6 @@ */ public class DateTruncEmulation extends AbstractSqmFunctionDescriptor implements FunctionRenderer { protected final String toDateFunction; - private final SqmFormat sqmFormat; protected DateTruncEmulation(String toDateFunction, TypeConfiguration typeConfiguration) { super( @@ -49,7 +48,6 @@ protected DateTruncEmulation(String toDateFunction, TypeConfiguration typeConfig StandardFunctionArgumentTypeResolvers.invariant( typeConfiguration, TEMPORAL, TEMPORAL_UNIT ) ); this.toDateFunction = toDateFunction; - this.sqmFormat = new SqmFormat( "yyyy-MM-dd HH:mm:ss", typeConfiguration.getBasicTypeForJavaType( String.class ), null ); } @Override @@ -106,7 +104,7 @@ protected SelfRenderingSqmFunction generateSqmFunctionExpression( final var datetime = arguments.get( 0 ); final var formatExpression = queryEngine.getSqmFunctionRegistry() - .findFunctionDescriptor( "format" ) + .getFunctionDescriptor( "format" ) .generateSqmExpression( asList( datetime, @@ -119,7 +117,7 @@ protected SelfRenderingSqmFunction generateSqmFunctionExpression( if ( literal != null ) { formattedDatetime = queryEngine.getSqmFunctionRegistry() - .findFunctionDescriptor( "concat" ) + .getFunctionDescriptor( "concat" ) .generateSqmExpression( asList( formatExpression, @@ -137,7 +135,7 @@ protected SelfRenderingSqmFunction generateSqmFunctionExpression( this, this, // the first argument is needed for SybaseDateTruncEmulation - asList( datetime, formattedDatetime, sqmFormat ), + asList( datetime, formattedDatetime, new SqmFormat( "yyyy-MM-dd HH:mm:ss", nodeBuilder.getStringType(), nodeBuilder ) ), impliedResultType, null, getReturnTypeResolver(), diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayViaElementArgumentReturnTypeResolver.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayViaElementArgumentReturnTypeResolver.java index f73df902c273..0c1415a1aa3a 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayViaElementArgumentReturnTypeResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayViaElementArgumentReturnTypeResolver.java @@ -11,6 +11,7 @@ import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.sqm.SqmBindableType; import org.hibernate.query.sqm.produce.function.FunctionReturnTypeResolver; import org.hibernate.query.sqm.sql.SqmToSqlAstConverter; import org.hibernate.query.sqm.tree.SqmTypedNode; @@ -61,7 +62,21 @@ else if ( inferredType instanceof BasicValuedMapping basicValuedMapping ) { } if ( elementIndex == -1 ) { for ( SqmTypedNode argument : arguments ) { - final DomainType sqmType = argument.getExpressible().getSqmType(); + final SqmBindableType expressible = argument.getExpressible(); + if ( expressible != null ) { + final DomainType sqmType = expressible.getSqmType(); + if ( sqmType instanceof ReturnableType ) { + return list + ? DdlTypeHelper.resolveListType( sqmType, typeConfiguration ) + : DdlTypeHelper.resolveArrayType( sqmType, typeConfiguration ); + } + } + } + } + else { + final SqmBindableType expressible = arguments.get( elementIndex ).getExpressible(); + if ( expressible != null ) { + final DomainType sqmType = expressible.getSqmType(); if ( sqmType instanceof ReturnableType ) { return list ? DdlTypeHelper.resolveListType( sqmType, typeConfiguration ) @@ -69,14 +84,6 @@ else if ( inferredType instanceof BasicValuedMapping basicValuedMapping ) { } } } - else { - final DomainType sqmType = arguments.get( elementIndex ).getExpressible().getSqmType(); - if ( sqmType instanceof ReturnableType ) { - return list - ? DdlTypeHelper.resolveListType( sqmType, typeConfiguration ) - : DdlTypeHelper.resolveArrayType( sqmType, typeConfiguration ); - } - } return null; } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/AbstractParameterDescriptor.java b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/AbstractParameterDescriptor.java index e33b4b5873b1..f3dd0c327913 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/AbstractParameterDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/AbstractParameterDescriptor.java @@ -4,6 +4,7 @@ */ package org.hibernate.engine.query.spi; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.EmbeddableDomainType; import org.hibernate.metamodel.model.domain.internal.EntityTypeImpl; @@ -19,39 +20,38 @@ public abstract class AbstractParameterDescriptor implements QueryParameter { private final int[] sourceLocations; - private BindableType expectedType; + private @Nullable BindableType expectedType; - public AbstractParameterDescriptor(int[] sourceLocations, BindableType expectedType) { + public AbstractParameterDescriptor(int[] sourceLocations, @Nullable BindableType expectedType) { this.sourceLocations = sourceLocations; this.expectedType = expectedType; } @Override - public String getName() { + public @Nullable String getName() { return null; } @Override - public Integer getPosition() { + public @Nullable Integer getPosition() { return null; } @Override - public Class getParameterType() { + public @Nullable Class getParameterType() { return expectedType == null ? null : expectedType.getJavaType(); } @Override - public BindableType getHibernateType() { + public @Nullable BindableType getHibernateType() { return getExpectedType(); } - - public BindableType getExpectedType() { + public @Nullable BindableType getExpectedType() { return expectedType; } - public void resetExpectedType(BindableType expectedType) { + public void resetExpectedType(@Nullable BindableType expectedType) { this.expectedType = expectedType; } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java index e71388bc999d..1213a3bb9bb0 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java @@ -328,12 +328,12 @@ void missingArguments( @LogMessage(level = WARN) @Message(value = "The query [%s] updates an immutable entity: %s", id = 487) - void immutableEntityUpdateQuery(String sourceQuery, String querySpaces); + void immutableEntityUpdateQuery(@Nullable String sourceQuery, String querySpaces); @LogMessage(level = DEBUG) @Message(value = "The query [%s] updates an immutable entity: %s", id = 488) - void immutableEntityUpdateQueryAllowed(String sourceQuery, String querySpaces); + void immutableEntityUpdateQueryAllowed(@Nullable String sourceQuery, String querySpaces); @LogMessage(level = INFO) @Message(value = "No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)", id = 489) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/IdentifiableDomainType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/IdentifiableDomainType.java index 300b3251955a..f0266e6dc99a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/IdentifiableDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/IdentifiableDomainType.java @@ -9,6 +9,7 @@ import java.util.function.Consumer; import jakarta.persistence.metamodel.IdentifiableType; import jakarta.persistence.metamodel.SingularAttribute; +import org.checkerframework.checker.nullness.qual.Nullable; /** * Extension to the JPA {@link IdentifiableType} contract. @@ -18,7 +19,7 @@ public interface IdentifiableDomainType extends ManagedDomainType, IdentifiableType { - PathSource getIdentifierDescriptor(); + @Nullable PathSource getIdentifierDescriptor(); @Override SingularPersistentAttribute getId(Class type); @@ -39,15 +40,15 @@ public interface IdentifiableDomainType SimpleDomainType getIdType(); @Override - IdentifiableDomainType getSupertype(); + @Nullable IdentifiableDomainType getSupertype(); boolean hasIdClass(); - SingularPersistentAttribute findIdAttribute(); + @Nullable SingularPersistentAttribute findIdAttribute(); void visitIdClassAttributes(Consumer> action); - SingularPersistentAttribute findVersionAttribute(); + @Nullable SingularPersistentAttribute findVersionAttribute(); - List> findNaturalIdAttributes(); + @Nullable List> findNaturalIdAttributes(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/ManagedDomainType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/ManagedDomainType.java index 7ac4e5a868c0..08be67b4bb56 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/ManagedDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/ManagedDomainType.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.function.Consumer; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Internal; import org.hibernate.metamodel.RepresentationMode; @@ -54,7 +55,7 @@ default Class getJavaType() { /** * The descriptor of the supertype of this type. */ - ManagedDomainType getSuperType(); + @Nullable ManagedDomainType getSuperType(); /** * The descriptors of all known managed subtypes of this type. @@ -73,24 +74,24 @@ default Class getJavaType() { @Override PersistentAttribute getDeclaredAttribute(String name); - PersistentAttribute findAttribute(String name); + @Nullable PersistentAttribute findAttribute(String name); - PersistentAttribute findSubTypesAttribute(String name); + @Nullable PersistentAttribute findSubTypesAttribute(String name); /** * @deprecated Use {@link #findAttribute(String)} */ @Deprecated(since = "7.0", forRemoval = true) - default PersistentAttribute findAttributeInSuperTypes(String name) { + default @Nullable PersistentAttribute findAttributeInSuperTypes(String name) { return findAttribute( name ); } - SingularPersistentAttribute findSingularAttribute(String name); - PluralPersistentAttribute findPluralAttribute(String name); - PersistentAttribute findConcreteGenericAttribute(String name); + @Nullable SingularPersistentAttribute findSingularAttribute(String name); + @Nullable PluralPersistentAttribute findPluralAttribute(String name); + @Nullable PersistentAttribute findConcreteGenericAttribute(String name); - PersistentAttribute findDeclaredAttribute(String name); - SingularPersistentAttribute findDeclaredSingularAttribute(String name); - PluralPersistentAttribute findDeclaredPluralAttribute(String name); - PersistentAttribute findDeclaredConcreteGenericAttribute(String name); + @Nullable PersistentAttribute findDeclaredAttribute(String name); + @Nullable SingularPersistentAttribute findDeclaredSingularAttribute(String name); + @Nullable PluralPersistentAttribute findDeclaredPluralAttribute(String name); + @Nullable PersistentAttribute findDeclaredConcreteGenericAttribute(String name); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java index 6fd4037718bc..443eaf08b7be 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.spi.NavigablePath; /** @@ -36,7 +37,7 @@ public interface PathSource { * @return null if the subPathSource is not found * @throws IllegalStateException to indicate that this source cannot be de-referenced */ - PathSource findSubPathSource(String name); + @Nullable PathSource findSubPathSource(String name); /** * Find a {@link PathSource} by name relative to this source. If {@code includeSubtypes} is set @@ -47,5 +48,5 @@ public interface PathSource { * @return null if the subPathSource is not found * @throws IllegalStateException to indicate that this source cannot be de-referenced */ - PathSource findSubPathSource(String name, boolean includeSubtypes); + @Nullable PathSource findSubPathSource(String name, boolean includeSubtypes); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractDiscriminatorSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractDiscriminatorSqmPathSource.java index d44c02d7b3fd..000aa2ddc76e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractDiscriminatorSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractDiscriminatorSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.query.sqm.SqmPathSource; @@ -40,7 +41,7 @@ public Class getJavaType() { } @Override - public SqmDomainType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return this; } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java index 673d95030c5a..e3edd41e03c2 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java @@ -15,6 +15,7 @@ import jakarta.persistence.metamodel.IdentifiableType; import jakarta.persistence.metamodel.SingularAttribute; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.AssertionFailure; import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; @@ -62,7 +63,7 @@ public abstract class AbstractIdentifiableType private List> nonAggregatedIdAttributes; private SqmEmbeddableDomainType idClassType; - private SqmPathSource identifierDescriptor; + private @Nullable SqmPathSource identifierDescriptor; private final boolean isVersioned; private SqmSingularPersistentAttribute versionAttribute; @@ -88,7 +89,7 @@ protected InFlightAccess createInFlightAccess() { } @Override - public SqmPathSource getIdentifierDescriptor() { + public @Nullable SqmPathSource getIdentifierDescriptor() { return identifierDescriptor; } @@ -102,13 +103,13 @@ public boolean hasSingleIdAttribute() { } @Override - public AbstractIdentifiableType getSuperType() { + public @Nullable AbstractIdentifiableType getSuperType() { // overridden simply to perform the cast return (AbstractIdentifiableType) super.getSuperType(); } @Override - public IdentifiableDomainType getSupertype() { + public @Nullable IdentifiableDomainType getSupertype() { return getSuperType(); } @@ -133,7 +134,7 @@ private void ensureNoIdClass() { @Override - public SqmSingularPersistentAttribute findIdAttribute() { + public @Nullable SqmSingularPersistentAttribute findIdAttribute() { if ( id != null ) { return id; } @@ -261,7 +262,7 @@ public SingularPersistentAttribute getVersion(Class javaTyp } @Override - public SqmSingularPersistentAttribute findVersionAttribute() { + public @Nullable SqmSingularPersistentAttribute findVersionAttribute() { if ( versionAttribute != null ) { return versionAttribute; } @@ -274,7 +275,7 @@ else if ( getSuperType() != null ) { } @Override - public List> findNaturalIdAttributes() { + public @Nullable List> findNaturalIdAttributes() { if ( naturalIdAttributes != null ) { return naturalIdAttributes; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java index 47878c06a702..f9c319934dd6 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java @@ -26,6 +26,7 @@ import jakarta.persistence.metamodel.SetAttribute; import jakarta.persistence.metamodel.SingularAttribute; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.RepresentationMode; import org.hibernate.metamodel.model.domain.BagPersistentAttribute; import org.hibernate.metamodel.model.domain.JpaMetamodel; @@ -56,7 +57,7 @@ public abstract class AbstractManagedType implements SqmManagedDomainType, AttributeContainer, Serializable { private final String hibernateTypeName; - private final SqmManagedDomainType supertype; + private final @Nullable SqmManagedDomainType supertype; private final RepresentationMode representationMode; private final JpaMetamodelImplementor metamodel; @@ -103,7 +104,7 @@ public Class getJavaType() { } @Override - public SqmManagedDomainType getSuperType() { + public @Nullable SqmManagedDomainType getSuperType() { return supertype; } @@ -175,7 +176,7 @@ public SqmPersistentAttribute getAttribute(String name) { } @Override - public SqmPersistentAttribute findAttribute(String name) { + public @Nullable SqmPersistentAttribute findAttribute(String name) { final var attribute = findDeclaredAttribute( name ); if ( attribute != null ) { return attribute; @@ -186,7 +187,7 @@ public SqmPersistentAttribute findAttribute(String name) { } @Override - public final SqmPersistentAttribute findAttributeInSuperTypes(String name) { + public final @Nullable SqmPersistentAttribute findAttributeInSuperTypes(String name) { final var attribute = findDeclaredAttribute( name ); if ( attribute != null ) { return attribute; @@ -197,7 +198,7 @@ public SqmPersistentAttribute findAttribute(String name) { } @Override - public SqmPersistentAttribute findSubTypesAttribute(String name) { + public @Nullable SqmPersistentAttribute findSubTypesAttribute(String name) { final var attribute = findDeclaredAttribute( name ); if ( attribute != null ) { return attribute; @@ -214,7 +215,7 @@ public SqmPersistentAttribute findAttribute(String name) { } @Override - public SqmPersistentAttribute findDeclaredAttribute(String name) { + public @Nullable SqmPersistentAttribute findDeclaredAttribute(String name) { // try singular attribute final var attribute = declaredSingularAttributes.get( name ); if ( attribute != null ) { @@ -281,7 +282,7 @@ public String getTypeName() { } @Override - public SqmSingularPersistentAttribute findSingularAttribute(String name) { + public @Nullable SqmSingularPersistentAttribute findSingularAttribute(String name) { final var attribute = findDeclaredSingularAttribute( name ); return attribute == null && getSuperType() != null ? getSuperType().findSingularAttribute( name ) @@ -301,7 +302,7 @@ public SqmSingularPersistentAttribute getSingularAttribute(Str } @Override - public SqmSingularPersistentAttribute findDeclaredSingularAttribute(String name) { + public @Nullable SqmSingularPersistentAttribute findDeclaredSingularAttribute(String name) { return declaredSingularAttributes.get( name ); } @@ -388,7 +389,7 @@ protected boolean isPrimitiveVariant(SingularAttribute attribute, Class } @Override - public SqmPluralPersistentAttribute findPluralAttribute(String name) { + public @Nullable SqmPluralPersistentAttribute findPluralAttribute(String name) { var attribute = findDeclaredPluralAttribute( name ); if ( attribute != null ) { return attribute; @@ -402,7 +403,7 @@ else if ( getSuperType() != null ) { } @Override - public SqmPluralPersistentAttribute findDeclaredPluralAttribute(String name) { + public @Nullable SqmPluralPersistentAttribute findDeclaredPluralAttribute(String name) { return declaredPluralAttributes == null ? null : declaredPluralAttributes.get( name ); } @@ -428,7 +429,7 @@ private void checkTypeForPluralAttributes( // Generic attributes @Override - public SqmPersistentAttribute findConcreteGenericAttribute(String name) { + public @Nullable SqmPersistentAttribute findConcreteGenericAttribute(String name) { final var attribute = findDeclaredConcreteGenericAttribute( name ); return attribute == null && getSuperType() != null ? getSuperType().findDeclaredConcreteGenericAttribute( name ) @@ -436,7 +437,7 @@ private void checkTypeForPluralAttributes( } @Override - public SqmPersistentAttribute findDeclaredConcreteGenericAttribute(String name) { + public @Nullable SqmPersistentAttribute findDeclaredConcreteGenericAttribute(String name) { return declaredConcreteGenericAttributes == null ? null : declaredConcreteGenericAttributes.get( name ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java index e9ae0c6c1579..8fcf2003a79a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.util.Collection; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.CollectionClassification; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.model.domain.SimpleDomainType; @@ -72,7 +73,7 @@ public SqmPathSource getElementPathSource() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { if ( CollectionPart.Nature.ELEMENT.getName().equals( name ) ) { return elementPathSource; } @@ -80,7 +81,7 @@ public SqmPathSource findSubPathSource(String name) { } @Override - public SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { + public @Nullable SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { return CollectionPart.Nature.ELEMENT.getName().equals( name ) ? elementPathSource : elementPathSource.findSubPathSource( name, includeSubtypes ); @@ -145,7 +146,7 @@ public Class getBindableJavaType() { @SuppressWarnings("unchecked") @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { // We need an unchecked cast here : PluralPersistentAttribute implements path source with its element type // but resolving paths from it must produce collection-typed expressions. return (SqmPath) new SqmPluralValuedSimplePath<>( @@ -157,7 +158,7 @@ public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePat } @Override - public NavigablePath createNavigablePath(SqmPath parent, String alias) { + public NavigablePath createNavigablePath(SqmPath parent, @Nullable String alias) { if ( parent == null ) { throw new IllegalArgumentException( "`lhs` cannot be null for a sub-navigable reference - " + getName() diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractSqmPathSource.java index c4ee0e0e6ec2..bec4de9a963d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.tree.domain.SqmDomainType; @@ -20,7 +21,7 @@ public abstract class AbstractSqmPathSource implements SqmPathSource { public AbstractSqmPathSource( String localPathName, - SqmPathSource pathModel, + @Nullable SqmPathSource pathModel, DomainType domainType, BindableType jpaBindableType) { this.localPathName = localPathName; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPath.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPath.java index 449df0210da4..3fbe0ec4040e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPath.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPath.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.NonNull; import org.hibernate.query.sqm.DiscriminatorSqmPath; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.SemanticQueryWalker; @@ -13,6 +14,8 @@ import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.spi.NavigablePath; +import static org.hibernate.internal.util.NullnessUtil.castNonNull; + public class AnyDiscriminatorSqmPath extends AbstractSqmPath implements DiscriminatorSqmPath { @@ -43,7 +46,12 @@ public X accept(SemanticQueryWalker walker) { } @Override - public AnyDiscriminatorSqmPathSource getExpressible() { + public @NonNull SqmPath getLhs() { + return castNonNull( super.getLhs() ); + } + + @Override + public @NonNull AnyDiscriminatorSqmPathSource getExpressible() { // return (AnyDiscriminatorSqmPathSource) getNodeType(); return (AnyDiscriminatorSqmPathSource) getReferencedPathSource(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPathSource.java index c9e757545878..a49b01080e81 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPathSource.java @@ -4,11 +4,13 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.annotations.AnyDiscriminator; import org.hibernate.metamodel.model.domain.SimpleDomainType; import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.query.sqm.SqmBindableType; import org.hibernate.query.sqm.SqmPathSource; +import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.spi.NavigablePath; import org.hibernate.type.BasicType; @@ -35,7 +37,7 @@ public AnyDiscriminatorSqmPathSource( } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { final NavigablePath navigablePath = intermediatePathSource == null ? lhs.getNavigablePath() @@ -59,7 +61,7 @@ public Class getJavaType() { } @Override - public BasicType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return getPathType(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingDomainTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingDomainTypeImpl.java index ce51f8a98b36..81e7b9977877 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingDomainTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingDomainTypeImpl.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.mapping.Any; import org.hibernate.mapping.Column; import org.hibernate.metamodel.model.domain.AnyMappingDomainType; @@ -57,7 +58,7 @@ public AnyMappingDomainTypeImpl( } @Override - public SqmDomainType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return this; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingSqmPathSource.java index a7a4f55a299a..ddb36525b75f 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyMappingSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.internal.AnyDiscriminatorPart; import org.hibernate.metamodel.mapping.internal.AnyKeyPart; @@ -45,7 +46,7 @@ public AnyMappingSqmPathSource( } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { return switch ( name ) { case AnyKeyPart.KEY_NAME -> // standard id() function @@ -65,7 +66,7 @@ public SqmPathSource findSubPathSource(String name) { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new SqmAnyValuedSimplePath<>( PathHelper.append( lhs, this, intermediatePathSource ), pathModel, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ArrayTupleType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ArrayTupleType.java index 510a25b3dd6a..f25f1eb7e394 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ArrayTupleType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ArrayTupleType.java @@ -7,6 +7,7 @@ import java.util.Arrays; import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.cache.MutableCacheKeyBuilder; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.IndexedConsumer; @@ -47,7 +48,7 @@ public String getTypeName() { } @Override - public SqmDomainType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return this; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BagAttributeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BagAttributeImpl.java index 74108a66863d..b37e25a6ff13 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BagAttributeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BagAttributeImpl.java @@ -6,6 +6,7 @@ import java.util.Collection; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.domain.SqmBagJoin; @@ -33,7 +34,7 @@ public CollectionType getCollectionType() { public SqmAttributeJoin createSqmJoin( SqmFrom lhs, SqmJoinType joinType, - String alias, + @Nullable String alias, boolean fetched, SqmCreationState creationState) { return new SqmBagJoin<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicSqmPathSource.java index 1a37351000e7..cd699971ba16 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.BasicDomainType; import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.query.sqm.TerminalPathException; @@ -25,7 +26,7 @@ public class BasicSqmPathSource public BasicSqmPathSource( String localPathName, - SqmPathSource pathModel, + @Nullable SqmPathSource pathModel, BasicDomainType domainType, JavaType relationalJavaType, BindableType jpaBindableType, @@ -46,14 +47,14 @@ public String getTypeName() { // } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { String path = pathModel.getPathName(); - String pathDesc = path==null || path.startsWith("{") ? " " : " '" + pathModel.getPathName() + "' "; + String pathDesc = path == null || path.startsWith( "{" ) ? " " : " '" + pathModel.getPathName() + "' "; throw new TerminalPathException( "Terminal path" + pathDesc + "has no attribute '" + name + "'" ); } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new SqmBasicValuedSimplePath<>( PathHelper.append( lhs, this, intermediatePathSource ), pathModel, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicTypeImpl.java index cd87addd5d72..5f9b4e28b01f 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicTypeImpl.java @@ -8,6 +8,7 @@ import java.sql.CallableStatement; import java.sql.SQLException; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.BasicDomainType; @@ -40,7 +41,7 @@ public String getTypeName() { } @Override - public SqmDomainType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return this; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java index bd59fb86ddf3..267c7cba8051 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.util.Collection; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.model.domain.DomainType; @@ -87,7 +88,7 @@ public String getPathName() { // } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { final var attribute = getPathType().findAttribute( name ); if ( attribute != null ) { return (SqmPathSource) attribute; @@ -106,7 +107,7 @@ public SqmPathSource findSubPathSource(String name) { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { throw new UnsupportedMappingException( "EmbeddableType cannot be used to create an SqmPath" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPath.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPath.java index 50a1858fa024..65a3b05667d5 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPath.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPath.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.NonNull; import org.hibernate.query.sqm.DiscriminatorSqmPath; import org.hibernate.metamodel.model.domain.EmbeddableDomainType; import org.hibernate.query.sqm.NodeBuilder; @@ -14,6 +15,8 @@ import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.spi.NavigablePath; +import static org.hibernate.internal.util.NullnessUtil.castNonNull; + /** * {@link SqmPath} specialization for an embeddable discriminator * @@ -37,7 +40,12 @@ public EmbeddableDomainType getEmbeddableDomainType() { } @Override - public EmbeddedDiscriminatorSqmPathSource getExpressible() { + public @NonNull SqmPath getLhs() { + return castNonNull( super.getLhs() ); + } + + @Override + public @NonNull EmbeddedDiscriminatorSqmPathSource getExpressible() { // return (EmbeddedDiscriminatorSqmPathSource) getNodeType(); return (EmbeddedDiscriminatorSqmPathSource) getReferencedPathSource(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPathSource.java index fb8eae866988..3995dba50690 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedDiscriminatorSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.EmbeddableDomainType; import org.hibernate.query.sqm.SqmPathSource; @@ -23,7 +24,7 @@ public EmbeddedDiscriminatorSqmPathSource(DomainType discriminatorType, Embed } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { //noinspection unchecked return new EmbeddedDiscriminatorSqmPath<>( PathHelper.append( lhs, this, intermediatePathSource ), diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedSqmPathSource.java index 6a59dab8f44c..7b58423069e1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddedSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.sqm.SqmJoinable; import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.tree.domain.SqmEmbeddedValuedSimplePath; @@ -21,7 +22,7 @@ public class EmbeddedSqmPathSource public EmbeddedSqmPathSource( String localPathName, - SqmPathSource pathModel, + @Nullable SqmPathSource pathModel, SqmEmbeddableDomainType domainType, BindableType jpaBindableType, boolean isGeneric) { @@ -36,7 +37,7 @@ public SqmEmbeddableDomainType getPathType() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { return getPathType().findSubPathSource( name ); } @@ -46,7 +47,7 @@ public boolean isGeneric() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new SqmEmbeddedValuedSimplePath<>( pathModel instanceof SqmJoinable sqmJoinable ? sqmJoinable.createNavigablePath( lhs, null ) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPath.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPath.java index fb7b474c6d86..10fe6fa1b404 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPath.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPath.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.NonNull; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.query.sqm.DiscriminatorSqmPath; import org.hibernate.metamodel.model.domain.EntityDomainType; @@ -17,6 +18,8 @@ import org.hibernate.query.sqm.tree.domain.SqmEntityDomainType; import org.hibernate.spi.NavigablePath; +import static org.hibernate.internal.util.NullnessUtil.castNonNull; + /** * {@link SqmPath} specialization for an entity discriminator @@ -49,7 +52,12 @@ public EntityMappingType getEntityDescriptor() { } @Override - public EntityDiscriminatorSqmPathSource getExpressible() { + public @NonNull SqmPath getLhs() { + return castNonNull( super.getLhs() ); + } + + @Override + public @NonNull EntityDiscriminatorSqmPathSource getExpressible() { // return (EntityDiscriminatorSqmPathSource) getNodeType(); return (EntityDiscriminatorSqmPathSource) getReferencedPathSource(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPathSource.java index 2ca951d69fdd..9026d8cfa82b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityDiscriminatorSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.query.sqm.SqmPathSource; @@ -38,7 +39,7 @@ public EntityMappingType getEntityMapping() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new EntityDiscriminatorSqmPath<>( PathHelper.append( lhs, this, intermediatePathSource ), pathModel, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntitySqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntitySqmPathSource.java index 318eac3ef10d..dff10e9fcc25 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntitySqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntitySqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.SqmJoinable; import org.hibernate.query.sqm.SqmPathSource; @@ -38,12 +39,12 @@ public SqmEntityDomainType getPathType() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { return getPathType().findSubPathSource( name ); } @Override - public SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { + public @Nullable SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { return getPathType().findSubPathSource( name, includeSubtypes ); } @@ -53,7 +54,7 @@ public boolean isGeneric() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new SqmEntityValuedSimplePath<>( PathHelper.append( lhs, this, intermediatePathSource ), pathModel, @@ -66,7 +67,7 @@ public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePat public SqmPluralPartJoin createSqmJoin( SqmFrom lhs, SqmJoinType joinType, - String alias, + @Nullable String alias, boolean fetched, SqmCreationState creationState) { return new SqmPluralPartJoin<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java index 0fa1d2c01da2..b9f2da1a067a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java @@ -12,6 +12,7 @@ import jakarta.persistence.metamodel.EntityType; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.mapping.PersistentClass; import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.DiscriminatorType; @@ -25,6 +26,7 @@ import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.PathException; import org.hibernate.query.sqm.SqmPathSource; +import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.query.sqm.tree.domain.SqmManagedDomainType; import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; @@ -133,7 +135,7 @@ public String getHibernateEntityName() { } @Override - public SqmEntityDomainType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return this; } @@ -148,7 +150,7 @@ public SqmEntityDomainType getPathType() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { final PersistentAttribute attribute = super.findAttribute( name ); if ( attribute != null ) { return (SqmPathSource) attribute; @@ -168,12 +170,12 @@ else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { } @Override - public SqmPathSource getIdentifierDescriptor() { + public @Nullable SqmPathSource getIdentifierDescriptor() { return super.getIdentifierDescriptor(); } @Override - public SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { + public @Nullable SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { final PersistentAttribute attribute = super.findAttribute( name ); if ( attribute != null ) { return (SqmPathSource) attribute; @@ -222,7 +224,7 @@ else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { } @Override - public SqmPersistentAttribute findAttribute(String name) { + public @Nullable SqmPersistentAttribute findAttribute(String name) { final var attribute = super.findAttribute( name ); if ( attribute != null ) { return attribute; @@ -257,7 +259,7 @@ public String toString() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { throw new UnsupportedMappingException( "EntityType cannot be used to create an SqmPath - that would be an SqmFrom which are created directly" ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ListAttributeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ListAttributeImpl.java index c3c95b9de18a..ad450d15ecdf 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ListAttributeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/ListAttributeImpl.java @@ -6,6 +6,7 @@ import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.hql.spi.SqmCreationState; @@ -46,7 +47,7 @@ public SqmPathSource getIndexPathSource() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { final CollectionPart.Nature nature = CollectionPart.Nature.fromNameExact( name ); if ( nature != null ) { switch ( nature ) { @@ -60,7 +61,7 @@ public SqmPathSource findSubPathSource(String name) { } @Override - public SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { + public @Nullable SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { return CollectionPart.Nature.INDEX.getName().equals( name ) ? indexPathSource : super.findSubPathSource( name, includeSubtypes ); @@ -77,7 +78,7 @@ public SqmPathSource getIntermediatePathSource(SqmPathSource pathSource) { public SqmAttributeJoin createSqmJoin( SqmFrom lhs, SqmJoinType joinType, - String alias, + @Nullable String alias, boolean fetched, SqmCreationState creationState) { return new SqmListJoin<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MapAttributeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MapAttributeImpl.java index 2b94f7a2fb3f..232450d10b74 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MapAttributeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MapAttributeImpl.java @@ -6,6 +6,7 @@ import java.util.Map; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.model.domain.SimpleDomainType; import org.hibernate.query.sqm.SqmPathSource; @@ -55,7 +56,7 @@ public SqmPathSource getIndexPathSource() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { final CollectionPart.Nature nature = CollectionPart.Nature.fromNameExact( name ); if ( nature != null ) { switch ( nature ) { @@ -69,7 +70,7 @@ public SqmPathSource findSubPathSource(String name) { } @Override - public SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { + public @Nullable SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { return CollectionPart.Nature.INDEX.getName().equals( name ) ? keyPathSource : super.findSubPathSource( name, includeSubtypes ); @@ -94,7 +95,7 @@ public SimpleDomainType getKeyGraphType() { @Override public SqmAttributeJoin createSqmJoin( - SqmFrom lhs, SqmJoinType joinType, String alias, boolean fetched, SqmCreationState creationState) { + SqmFrom lhs, SqmJoinType joinType, @Nullable String alias, boolean fetched, SqmCreationState creationState) { return new SqmMapJoin<>( lhs, this, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassSqmPathSource.java index 6737b2cdcfe2..b536c1e803f2 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.SqmJoinable; import org.hibernate.query.sqm.SqmPathSource; @@ -38,7 +39,7 @@ public SqmMappedSuperclassDomainType getPathType() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { return getPathType().findSubPathSource( name ); } @@ -48,7 +49,7 @@ public boolean isGeneric() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new SqmEntityValuedSimplePath<>( PathHelper.append( lhs, this, intermediatePathSource ), pathModel, @@ -61,7 +62,7 @@ public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePat public SqmPluralPartJoin createSqmJoin( SqmFrom lhs, SqmJoinType joinType, - String alias, + @Nullable String alias, boolean fetched, SqmCreationState creationState) { return new SqmPluralPartJoin<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java index d78469aeba36..eb6030e662f8 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.mapping.MappedSuperclass; import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; @@ -11,6 +12,7 @@ import org.hibernate.metamodel.model.domain.PersistentAttribute; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; import org.hibernate.query.sqm.SqmPathSource; +import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmMappedSuperclassDomainType; import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; @@ -71,7 +73,7 @@ public Class getBindableJavaType() { } @Override - public SqmMappedSuperclassDomainType getSqmType() { + public @Nullable SqmDomainType getSqmType() { return this; } @@ -86,7 +88,7 @@ public SqmMappedSuperclassDomainType getPathType() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { final PersistentAttribute attribute = findAttribute( name ); if ( attribute != null ) { return (SqmPathSource) attribute; @@ -100,12 +102,12 @@ else if ( "id".equalsIgnoreCase( name ) ) { } @Override - public SqmPathSource getIdentifierDescriptor() { + public @Nullable SqmPathSource getIdentifierDescriptor() { return (SqmPathSource) super.getIdentifierDescriptor(); } @Override - public SqmPersistentAttribute findAttribute(String name) { + public @Nullable SqmPersistentAttribute findAttribute(String name) { final var attribute = super.findAttribute( name ); if ( attribute != null ) { return attribute; @@ -134,7 +136,7 @@ protected boolean isIdMappingRequired() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { throw new UnsupportedMappingException( "MappedSuperclassType cannot be used to create an SqmPath - that would be an SqmFrom which are created directly" ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java index ad7059bbc1b3..33209e400641 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java @@ -641,7 +641,7 @@ public String[] getAllCollectionRoles() { } @Override - public BindableType resolveParameterBindType(Class javaType) { + public @Nullable BindableType resolveParameterBindType(Class javaType) { final var typeConfiguration = getTypeConfiguration(); final BasicType basicType = typeConfiguration.getBasicTypeForJavaType( javaType ); @@ -679,7 +679,7 @@ public BindableType resolveParameterBindType(Class javaType) { } @Override - public BindableType resolveParameterBindType(T bindValue) { + public @Nullable BindableType resolveParameterBindType(@Nullable T bindValue) { if ( bindValue == null ) { // we can't guess return null; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/NonAggregatedCompositeSqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/NonAggregatedCompositeSqmPathSource.java index 89fe0c7acdfc..7ea55aa9cc9e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/NonAggregatedCompositeSqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/NonAggregatedCompositeSqmPathSource.java @@ -4,6 +4,7 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.tree.domain.NonAggregatedCompositeSimplePath; @@ -29,12 +30,12 @@ public NonAggregatedCompositeSqmPathSource( } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { return (SqmPathSource) container.findAttribute( name ); } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return new NonAggregatedCompositeSimplePath<>( PathHelper.append( lhs, this, intermediatePathSource ), pathModel, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/PathHelper.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/PathHelper.java index c40504ed8138..b9889b827173 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/PathHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/PathHelper.java @@ -4,12 +4,13 @@ */ package org.hibernate.metamodel.model.domain.internal; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.spi.NavigablePath; public class PathHelper { - public static NavigablePath append(SqmPath lhs, SqmPathSource rhs, SqmPathSource intermediatePathSource) { + public static NavigablePath append(SqmPath lhs, SqmPathSource rhs, @Nullable SqmPathSource intermediatePathSource) { return intermediatePathSource == null ? lhs.getNavigablePath().append( rhs.getPathName() ) : lhs.getNavigablePath().append( intermediatePathSource.getPathName() ).append( rhs.getPathName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SetAttributeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SetAttributeImpl.java index b288118ecce1..81abbf49629f 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SetAttributeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SetAttributeImpl.java @@ -6,6 +6,7 @@ import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.domain.SqmSetJoin; @@ -31,7 +32,7 @@ public CollectionType getCollectionType() { @Override public SqmAttributeJoin createSqmJoin( - SqmFrom lhs, SqmJoinType joinType, String alias, boolean fetched, SqmCreationState creationState) { + SqmFrom lhs, SqmJoinType joinType, @Nullable String alias, boolean fetched, SqmCreationState creationState) { return new SqmSetJoin<>( lhs, this, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java index 9ef5d8703706..28f1f9c3565d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java @@ -7,6 +7,8 @@ import java.io.Serializable; import java.lang.reflect.Member; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.AttributeClassification; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.model.domain.AnyMappingDomainType; @@ -124,12 +126,12 @@ public Class getBindableJavaType() { } @Override - public SqmPathSource findSubPathSource(String name) { + public @Nullable SqmPathSource findSubPathSource(String name) { return sqmPathSource.findSubPathSource( name ); } @Override - public SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { + public @Nullable SqmPathSource findSubPathSource(String name, boolean includeSubtypes) { return sqmPathSource.findSubPathSource( name, includeSubtypes ); } @@ -139,7 +141,7 @@ public SqmPathSource getSqmPathSource() { } @Override - public SqmBindableType getExpressible() { + public @NonNull SqmBindableType getExpressible() { return sqmPathSource.getExpressible(); } @@ -152,7 +154,7 @@ public boolean isGeneric() { public SqmJoin createSqmJoin( SqmFrom lhs, SqmJoinType joinType, - String alias, + @Nullable String alias, boolean fetched, SqmCreationState creationState) { final NodeBuilder nodeBuilder = creationState.getCreationContext().getNodeBuilder(); @@ -187,7 +189,7 @@ else if ( sqmPathSource.getPathType() instanceof BasicPluralType ) { } @Override - public NavigablePath createNavigablePath(SqmPath parent, String alias) { + public NavigablePath createNavigablePath(SqmPath parent, @Nullable String alias) { if ( parent == null ) { throw new IllegalArgumentException( "LHS cannot be null for a sub-navigable reference - " + getName() @@ -224,7 +226,7 @@ public Identifier( } @Override - public NavigablePath createNavigablePath(SqmPath parent, String alias) { + public NavigablePath createNavigablePath(SqmPath parent, @Nullable String alias) { if ( parent == null ) { throw new IllegalArgumentException( "LHS cannot be null for a sub-navigable reference - " + getName() @@ -305,7 +307,7 @@ public BindableType getBindableType() { } @Override - public SqmPath createSqmPath(SqmPath lhs, SqmPathSource intermediatePathSource) { + public SqmPath createSqmPath(SqmPath lhs, @Nullable SqmPathSource intermediatePathSource) { return sqmPathSource.createSqmPath( lhs, intermediatePathSource ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/QueryParameter.java b/hibernate-core/src/main/java/org/hibernate/query/QueryParameter.java index fc12cbdde192..115034f59082 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/QueryParameter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/QueryParameter.java @@ -4,6 +4,7 @@ */ package org.hibernate.query; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.type.BindableType; @@ -55,5 +56,5 @@ default boolean isOrdinal() { * * @return The associated Hibernate Type, may be {@code null}. */ - BindableType getHibernateType(); + @Nullable BindableType getHibernateType(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/SemanticException.java b/hibernate-core/src/main/java/org/hibernate/query/SemanticException.java index 87f479bd9256..194a23d062f4 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/SemanticException.java +++ b/hibernate-core/src/main/java/org/hibernate/query/SemanticException.java @@ -4,6 +4,7 @@ */ package org.hibernate.query; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.QueryException; /** @@ -29,15 +30,15 @@ public SemanticException(String message) { * about the query which caused the failure */ @Deprecated(since = "6.3") - public SemanticException(String message, Exception cause) { + public SemanticException(String message, @Nullable Exception cause) { super( message, cause ); } - public SemanticException(String message, String queryString) { + public SemanticException(String message, @Nullable String queryString) { super( message, queryString ); } - public SemanticException(String message, String queryString, Exception cause) { + public SemanticException(String message, @Nullable String queryString, @Nullable Exception cause) { super( message, queryString, cause ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/CriteriaDefinition.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/CriteriaDefinition.java index 7105a9213e2d..a556231b4e46 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/CriteriaDefinition.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/CriteriaDefinition.java @@ -9,6 +9,7 @@ import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.*; import jakarta.persistence.metamodel.EntityType; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.SessionFactory; import org.hibernate.SharedSessionContract; @@ -248,7 +249,7 @@ public JpaCriteriaQuery multiselect(List> list) { } @Override - public JpaCriteriaQuery where(Expression restriction) { + public JpaCriteriaQuery where(@Nullable Expression restriction) { return query.where(restriction); } @@ -348,7 +349,7 @@ public Class getResultType() { } @Override - public JpaPredicate getRestriction() { + public @Nullable JpaPredicate getRestriction() { return query.getRestriction(); } @@ -433,7 +434,7 @@ public Collection> getCteCriterias() { } @Override - public JpaCteCriteria getCteCriteria(String cteName) { + public @Nullable JpaCteCriteria getCteCriteria(String cteName) { return query.getCteCriteria(cteName); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java index d3e94bfc0715..d21452932703 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java @@ -19,6 +19,7 @@ import java.util.Map; import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.query.NullPrecedence; import org.hibernate.query.SortDirection; @@ -635,7 +636,7 @@ default JpaSubQuery except(Subquery query1, Subquery... q JpaExpression toString(Expression character); @Override - JpaExpression literal(T value); + JpaExpression literal(@Nullable T value); List> literals(T... values); @@ -765,7 +766,7 @@ JpaFunction locate( > JpaExpression> indexes(L list); - JpaExpression value(T value); + JpaExpression value(@Nullable T value); @Override > Expression> values(M map); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCoalesce.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCoalesce.java index e709310c0a65..15b9a0246a18 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCoalesce.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCoalesce.java @@ -6,13 +6,14 @@ import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Expression; +import org.checkerframework.checker.nullness.qual.Nullable; /** * @author Steve Ebersole */ public interface JpaCoalesce extends JpaExpression, CriteriaBuilder.Coalesce { @Override - JpaCoalesce value(T value); + JpaCoalesce value(@Nullable T value); @Override JpaCoalesce value(Expression value); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCollectionJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCollectionJoin.java index 04002d1a1b00..7d058bc1b51e 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCollectionJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCollectionJoin.java @@ -6,6 +6,7 @@ import java.util.Collection; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import jakarta.persistence.criteria.CollectionJoin; @@ -20,16 +21,16 @@ public interface JpaCollectionJoin extends JpaPluralJoin, T>, CollectionJoin { @Override - JpaCollectionJoin on(JpaExpression restriction); + JpaCollectionJoin on(@Nullable JpaExpression restriction); @Override - JpaCollectionJoin on(Expression restriction); + JpaCollectionJoin on(@Nullable Expression restriction); @Override - JpaCollectionJoin on(JpaPredicate... restrictions); + JpaCollectionJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaCollectionJoin on(Predicate... restrictions); + JpaCollectionJoin on(Predicate @Nullable... restrictions); @Override JpaTreatedJoin treatAs(Class treatAsType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaConflictUpdateAction.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaConflictUpdateAction.java index 98b17aafab15..0122a79181ec 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaConflictUpdateAction.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaConflictUpdateAction.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import jakarta.persistence.criteria.Expression; @@ -25,7 +26,7 @@ public interface JpaConflictUpdateAction { * @param value new value * @return the modified update query */ - JpaConflictUpdateAction set(SingularAttribute attribute, X value); + JpaConflictUpdateAction set(SingularAttribute attribute, @Nullable X value); /** * Update the value of the specified attribute. @@ -41,7 +42,7 @@ public interface JpaConflictUpdateAction { * @param value new value * @return the modified update query */ - JpaConflictUpdateAction set(Path attribute, X value); + JpaConflictUpdateAction set(Path attribute, @Nullable X value); /** * Update the value of the specified attribute. @@ -57,7 +58,7 @@ public interface JpaConflictUpdateAction { * @param value new value * @return the modified update query */ - JpaConflictUpdateAction set(String attributeName, Object value); + JpaConflictUpdateAction set(String attributeName, @Nullable Object value); /** * Modify the update query to restrict the target of the update @@ -66,7 +67,7 @@ public interface JpaConflictUpdateAction { * @param restriction a simple or compound boolean expression * @return the modified update query */ - JpaConflictUpdateAction where(Expression restriction); + JpaConflictUpdateAction where(@Nullable Expression restriction); /** * Modify the update query to restrict the target of the update @@ -78,7 +79,7 @@ public interface JpaConflictUpdateAction { * @param restrictions zero or more restriction predicates * @return the modified update query */ - JpaConflictUpdateAction where(Predicate... restrictions); + JpaConflictUpdateAction where(Predicate @Nullable... restrictions); /** * Return the predicate that corresponds to the where clause @@ -86,5 +87,5 @@ public interface JpaConflictUpdateAction { * specified. * @return where clause predicate */ - JpaPredicate getRestriction(); + @Nullable JpaPredicate getRestriction(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaBase.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaBase.java index 3688291af45e..311bf12a4f98 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaBase.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaBase.java @@ -5,6 +5,7 @@ package org.hibernate.query.criteria; import jakarta.persistence.criteria.CommonAbstractCriteria; +import org.checkerframework.checker.nullness.qual.Nullable; /** * @author Steve Ebersole @@ -14,5 +15,5 @@ public interface JpaCriteriaBase extends CommonAbstractCriteria, JpaCriteriaNode JpaSubQuery subquery(Class type); @Override - JpaPredicate getRestriction(); + @Nullable JpaPredicate getRestriction(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaInsertSelect.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaInsertSelect.java index 3ba31cf6b6b1..2b48cf0f680a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaInsertSelect.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaInsertSelect.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import jakarta.persistence.Tuple; @@ -36,5 +37,5 @@ public interface JpaCriteriaInsertSelect extends JpaCriteriaInsert { JpaCriteriaInsertSelect select(CriteriaQuery criteriaQuery); @Override - JpaCriteriaInsertSelect onConflict(JpaConflictClause conflictClause); + JpaCriteriaInsertSelect onConflict(@Nullable JpaConflictClause conflictClause); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaQuery.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaQuery.java index b4b862dba9f3..117e3b41d25e 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaQuery.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaQuery.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.query.common.FetchClauseType; @@ -46,19 +47,19 @@ public interface JpaCriteriaQuery extends CriteriaQuery, JpaQueryableCrite // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Limit/Offset/Fetch clause - JpaExpression getOffset(); + @Nullable JpaExpression getOffset(); - JpaCriteriaQuery offset(JpaExpression offset); + JpaCriteriaQuery offset(@Nullable JpaExpression offset); - JpaCriteriaQuery offset(Number offset); + JpaCriteriaQuery offset(@Nullable Number offset); - JpaExpression getFetch(); + @Nullable JpaExpression getFetch(); - JpaCriteriaQuery fetch(JpaExpression fetch); + JpaCriteriaQuery fetch(@Nullable JpaExpression fetch); JpaCriteriaQuery fetch(JpaExpression fetch, FetchClauseType fetchClauseType); - JpaCriteriaQuery fetch(Number fetch); + JpaCriteriaQuery fetch(@Nullable Number fetch); JpaCriteriaQuery fetch(Number fetch, FetchClauseType fetchClauseType); @@ -130,10 +131,10 @@ public interface JpaCriteriaQuery extends CriteriaQuery, JpaQueryableCrite JpaCriteriaQuery multiselect(List> selectionList); @Override - JpaCriteriaQuery where(Expression restriction); + JpaCriteriaQuery where(@Nullable Expression restriction); @Override - JpaCriteriaQuery where(Predicate... restrictions); + JpaCriteriaQuery where(Predicate @Nullable... restrictions); @Override JpaCriteriaQuery where(List restrictions); @@ -145,10 +146,10 @@ public interface JpaCriteriaQuery extends CriteriaQuery, JpaQueryableCrite JpaCriteriaQuery groupBy(List> grouping); @Override - JpaCriteriaQuery having(Expression restriction); + JpaCriteriaQuery having(@Nullable Expression restriction); @Override - JpaCriteriaQuery having(Predicate... restrictions); + JpaCriteriaQuery having(Predicate @Nullable... restrictions); @Override JpaCriteriaQuery having(List restrictions); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaUpdate.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaUpdate.java index 486a717492bd..152ee43b0b93 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaUpdate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaUpdate.java @@ -10,6 +10,7 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.SingularAttribute; +import org.checkerframework.checker.nullness.qual.Nullable; /** * @author Steve Ebersole @@ -29,26 +30,26 @@ public interface JpaCriteriaUpdate extends JpaManipulationCriteria, Criter JpaRoot from(EntityType entity); @Override - JpaCriteriaUpdate set(SingularAttribute attribute, X value); + JpaCriteriaUpdate set(SingularAttribute attribute, @Nullable X value); @Override JpaCriteriaUpdate set( SingularAttribute attribute, Expression value); @Override - JpaCriteriaUpdate set(Path attribute, X value); + JpaCriteriaUpdate set(Path attribute, @Nullable X value); @Override JpaCriteriaUpdate set(Path attribute, Expression value); @Override - JpaCriteriaUpdate set(String attributeName, Object value); + JpaCriteriaUpdate set(String attributeName, @Nullable Object value); @Override JpaRoot getRoot(); @Override - JpaCriteriaUpdate where(Expression restriction); + JpaCriteriaUpdate where(@Nullable Expression restriction); @Override - JpaCriteriaUpdate where(Predicate... restrictions); + JpaCriteriaUpdate where(Predicate @Nullable... restrictions); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteContainer.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteContainer.java index eb13b047d0f3..19e357fa6c96 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteContainer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteContainer.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.function.Function; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import jakarta.persistence.criteria.AbstractQuery; @@ -26,7 +27,7 @@ public interface JpaCteContainer extends JpaCriteriaNode { /** * Returns a CTE that is registered by the given name on this container, or any of its parents. */ - JpaCteCriteria getCteCriteria(String cteName); + @Nullable JpaCteCriteria getCteCriteria(String cteName); /** * Registers the given {@link CriteriaQuery} and returns a {@link JpaCteCriteria}, diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteria.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteria.java index 1b3b6fc8073f..7f24e06561eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteria.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteria.java @@ -7,6 +7,7 @@ import java.util.Arrays; import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.sql.ast.tree.cte.CteMaterialization; import org.hibernate.sql.ast.tree.cte.CteSearchClauseKind; @@ -20,7 +21,7 @@ public interface JpaCteCriteria extends JpaCriteriaNode { /** * The name under which this CTE is registered. */ - String getName(); + @Nullable String getName(); /** * The type of the CTE. @@ -47,7 +48,7 @@ public interface JpaCteCriteria extends JpaCriteriaNode { * The kind of search (breadth-first or depth-first) that should be done for a recursive query. * May be null if unspecified or if this is not a recursive query. */ - CteSearchClauseKind getSearchClauseKind(); + @Nullable CteSearchClauseKind getSearchClauseKind(); /** * The order by which should be searched. */ @@ -56,7 +57,7 @@ public interface JpaCteCriteria extends JpaCriteriaNode { * The attribute name by which one can order the final CTE result, to achieve the search order. * Note that an implicit {@link JpaCteCriteriaAttribute} will be made available for this. */ - String getSearchAttributeName(); + @Nullable String getSearchAttributeName(); default void search(CteSearchClauseKind kind, String searchAttributeName, JpaSearchOrder... searchOrders) { search( kind, searchAttributeName, Arrays.asList( searchOrders ) ); @@ -73,23 +74,23 @@ default void search(CteSearchClauseKind kind, String searchAttributeName, JpaSea * The attribute name which is used to mark when a cycle has been detected. * Note that an implicit {@link JpaCteCriteriaAttribute} will be made available for this. */ - String getCycleMarkAttributeName(); + @Nullable String getCycleMarkAttributeName(); /** * The attribute name that represents the computation path, which is used for cycle detection. * Note that an implicit {@link JpaCteCriteriaAttribute} will be made available for this. */ - String getCyclePathAttributeName(); + @Nullable String getCyclePathAttributeName(); /** * The value which is set for the cycle mark attribute when a cycle is detected. */ - Object getCycleValue(); + @Nullable Object getCycleValue(); /** * The default value for the cycle mark attribute when no cycle is detected. */ - Object getNoCycleValue(); + @Nullable Object getNoCycleValue(); default void cycle(String cycleMarkAttributeName, JpaCteCriteriaAttribute... cycleColumns) { cycleUsing( cycleMarkAttributeName, null, Arrays.asList( cycleColumns ) ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaAttribute.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaAttribute.java index 46c0acb09d40..6bacdc7d977c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaAttribute.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; /** @@ -25,5 +26,5 @@ public interface JpaCteCriteriaAttribute extends JpaCriteriaNode { /** * The java type of the attribute. */ - Class getJavaType(); + @Nullable Class getJavaType(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaType.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaType.java index ba0a266149bd..4fea143ee47f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCteCriteriaType.java @@ -6,6 +6,7 @@ import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.DomainType; @@ -18,7 +19,7 @@ public interface JpaCteCriteriaType extends JpaCriteriaNode { /** * The name under which this CTE is registered. */ - String getName(); + @Nullable String getName(); /** * The domain type of the CTE. @@ -33,5 +34,5 @@ public interface JpaCteCriteriaType extends JpaCriteriaNode { /** * Returns the found attribute or null. */ - JpaCteCriteriaAttribute getAttribute(String name); + @Nullable JpaCteCriteriaAttribute getAttribute(String name); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaDerivedJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaDerivedJoin.java index d9809bd46e62..e5cb3d4adde3 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaDerivedJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaDerivedJoin.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import jakarta.persistence.criteria.Expression; @@ -23,15 +24,15 @@ public interface JpaDerivedJoin extends JpaDerivedFrom, JpaJoin { boolean isLateral(); @Override - JpaDerivedJoin on(JpaExpression restriction); + JpaDerivedJoin on(@Nullable JpaExpression restriction); @Override - JpaDerivedJoin on(Expression restriction); + JpaDerivedJoin on(@Nullable Expression restriction); @Override - JpaDerivedJoin on(JpaPredicate... restrictions); + JpaDerivedJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaDerivedJoin on(Predicate... restrictions); + JpaDerivedJoin on(Predicate @Nullable... restrictions); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaFunctionJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaFunctionJoin.java index 3b727d3b1103..1b16463b47bf 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaFunctionJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaFunctionJoin.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import jakarta.persistence.criteria.Expression; @@ -23,15 +24,15 @@ public interface JpaFunctionJoin extends JpaFunctionFrom, JpaJoin< boolean isLateral(); @Override - JpaFunctionJoin on(JpaExpression restriction); + JpaFunctionJoin on(@Nullable JpaExpression restriction); @Override - JpaFunctionJoin on(Expression restriction); + JpaFunctionJoin on(@Nullable Expression restriction); @Override - JpaFunctionJoin on(JpaPredicate... restrictions); + JpaFunctionJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaFunctionJoin on(Predicate... restrictions); + JpaFunctionJoin on(Predicate @Nullable... restrictions); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaInPredicate.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaInPredicate.java index 435ac3527688..481cd0c0609c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaInPredicate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaInPredicate.java @@ -5,6 +5,7 @@ package org.hibernate.query.criteria; import jakarta.persistence.criteria.CriteriaBuilder; +import org.checkerframework.checker.nullness.qual.NonNull; /** * @author Steve Ebersole @@ -24,7 +25,7 @@ public interface JpaInPredicate extends JpaPredicate, CriteriaBuilder.In * @return in predicate */ @Override - JpaInPredicate value(T value); + JpaInPredicate value(@NonNull T value); /** * Add to list of values to be tested against. diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaJoin.java index efbaee50323f..3eebb34bc901 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaJoin.java @@ -9,6 +9,7 @@ import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Predicate; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.PersistentAttribute; @@ -20,17 +21,17 @@ */ public interface JpaJoin extends JpaFrom, Join { @Override - PersistentAttribute getAttribute(); + @Nullable PersistentAttribute getAttribute(); - JpaJoin on(JpaExpression restriction); + JpaJoin on(@Nullable JpaExpression restriction); @Override - JpaJoin on(Expression restriction); + JpaJoin on(@Nullable Expression restriction); - JpaJoin on(JpaPredicate... restrictions); + JpaJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaJoin on(Predicate... restrictions); + JpaJoin on(Predicate @Nullable... restrictions); @Override JpaTreatedJoin treatAs(Class treatAsType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaListJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaListJoin.java index d6bde4c72666..af89df3e8225 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaListJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaListJoin.java @@ -6,6 +6,7 @@ import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import jakarta.persistence.criteria.Expression; @@ -19,16 +20,16 @@ */ public interface JpaListJoin extends JpaPluralJoin, T>, ListJoin { @Override - JpaListJoin on(JpaExpression restriction); + JpaListJoin on(@Nullable JpaExpression restriction); @Override - JpaListJoin on(Expression restriction); + JpaListJoin on(@Nullable Expression restriction); @Override - JpaListJoin on(JpaPredicate... restrictions); + JpaListJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaListJoin on(Predicate... restrictions); + JpaListJoin on(Predicate @Nullable... restrictions); @Override JpaTreatedJoin treatAs(Class treatAsType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaMapJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaMapJoin.java index e73eb090d303..0c2ca47798f7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaMapJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaMapJoin.java @@ -6,6 +6,7 @@ import java.util.Map; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import jakarta.persistence.criteria.Expression; @@ -19,16 +20,16 @@ */ public interface JpaMapJoin extends JpaPluralJoin, V>, MapJoin { @Override - JpaMapJoin on(JpaExpression restriction); + JpaMapJoin on(@Nullable JpaExpression restriction); @Override - JpaMapJoin on(Expression restriction); + JpaMapJoin on(@Nullable Expression restriction); @Override - JpaMapJoin on(JpaPredicate... restrictions); + JpaMapJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaMapJoin on(Predicate... restrictions); + JpaMapJoin on(Predicate @Nullable... restrictions); @Override JpaTreatedJoin treatAs(Class treatAsType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPath.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPath.java index e0ea42bce99c..0d759a45115b 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPath.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPath.java @@ -13,6 +13,7 @@ import jakarta.persistence.metamodel.PluralAttribute; import jakarta.persistence.metamodel.SingularAttribute; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.spi.NavigablePath; @@ -30,7 +31,7 @@ public interface JpaPath extends JpaExpression, Path { /** * The source (think "left hand side") of this path */ - JpaPath getLhs(); + @Nullable JpaPath getLhs(); /** * Support for JPA's explicit (TREAT) down-casting. @@ -46,7 +47,7 @@ public interface JpaPath extends JpaExpression, Path { // Covariant overrides @Override - default JpaPath getParentPath() { + default @Nullable JpaPath getParentPath() { return getLhs(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPluralJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPluralJoin.java index a8f0f128412e..7d2cb94f02c6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPluralJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaPluralJoin.java @@ -4,6 +4,8 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; @@ -18,19 +20,19 @@ */ public interface JpaPluralJoin extends JpaJoin, PluralJoin { @Override - PluralPersistentAttribute getAttribute(); + @NonNull PluralPersistentAttribute getAttribute(); @Override - JpaPluralJoin on(JpaExpression restriction); + JpaPluralJoin on(@Nullable JpaExpression restriction); @Override - JpaPluralJoin on(Expression restriction); + JpaPluralJoin on(@Nullable Expression restriction); @Override - JpaPluralJoin on(JpaPredicate... restrictions); + JpaPluralJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaPluralJoin on(Predicate... restrictions); + JpaPluralJoin on(Predicate @Nullable... restrictions); @Override JpaTreatedJoin treatAs(Class treatAsType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryPart.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryPart.java index 93b563f7c179..f50dc5a482eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryPart.java @@ -6,6 +6,7 @@ import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.common.FetchClauseType; /** @@ -31,13 +32,13 @@ public interface JpaQueryPart extends JpaCriteriaNode { //TODO: these operations should only accept integer literals or parameters - JpaExpression getOffset(); + @Nullable JpaExpression getOffset(); - JpaQueryPart setOffset(JpaExpression offset); + JpaQueryPart setOffset(@Nullable JpaExpression offset); - JpaExpression getFetch(); + @Nullable JpaExpression getFetch(); - JpaQueryPart setFetch(JpaExpression fetch); + JpaQueryPart setFetch(@Nullable JpaExpression fetch); JpaQueryPart setFetch(JpaExpression fetch, FetchClauseType fetchClauseType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryStructure.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryStructure.java index 9820da5dbdfd..d1536757749c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaQueryStructure.java @@ -9,6 +9,7 @@ import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.common.FetchClauseType; /** @@ -52,11 +53,11 @@ public interface JpaQueryStructure extends JpaQueryPart { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Where clause - JpaPredicate getRestriction(); + @Nullable JpaPredicate getRestriction(); - JpaQueryStructure setRestriction(JpaPredicate restriction); + JpaQueryStructure setRestriction(@Nullable JpaPredicate restriction); - JpaQueryStructure setRestriction(Expression restriction); + JpaQueryStructure setRestriction(@Nullable Expression restriction); JpaQueryStructure setRestriction(Predicate... restrictions); @@ -72,11 +73,11 @@ public interface JpaQueryStructure extends JpaQueryPart { JpaQueryStructure setGroupingExpressions(Expression... grouping); - JpaPredicate getGroupRestriction(); + @Nullable JpaPredicate getGroupRestriction(); - JpaQueryStructure setGroupRestriction(JpaPredicate restrictions); + JpaQueryStructure setGroupRestriction(@Nullable JpaPredicate restrictions); - JpaQueryStructure setGroupRestriction(Expression restriction); + JpaQueryStructure setGroupRestriction(@Nullable Expression restriction); JpaQueryStructure setGroupRestriction(Predicate... restrictions); @@ -89,10 +90,10 @@ public interface JpaQueryStructure extends JpaQueryPart { JpaQueryStructure setSortSpecifications(List sortSpecifications); @Override - JpaQueryStructure setOffset(JpaExpression offset); + JpaQueryStructure setOffset(@Nullable JpaExpression offset); @Override - JpaQueryStructure setFetch(JpaExpression fetch); + JpaQueryStructure setFetch(@Nullable JpaExpression fetch); @Override JpaQueryStructure setFetch(JpaExpression fetch, FetchClauseType fetchClauseType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSelectCriteria.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSelectCriteria.java index 235cea3c2763..471a0225f2bc 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSelectCriteria.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSelectCriteria.java @@ -10,6 +10,7 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Subquery; import jakarta.persistence.metamodel.EntityType; +import org.checkerframework.checker.nullness.qual.Nullable; /** * Commonality between a JPA {@link JpaCriteriaQuery} and {@link JpaSubQuery}, @@ -58,7 +59,7 @@ public interface JpaSelectCriteria extends AbstractQuery, JpaCriteriaBase JpaSelectCriteria distinct(boolean distinct); @Override - JpaSelection getSelection(); + @Nullable JpaSelection getSelection(); @Override JpaRoot from(Class entityClass); @@ -67,13 +68,13 @@ public interface JpaSelectCriteria extends AbstractQuery, JpaCriteriaBase JpaRoot from(EntityType entity); @Override - JpaPredicate getRestriction(); + @Nullable JpaPredicate getRestriction(); @Override - JpaSelectCriteria where(Expression restriction); + JpaSelectCriteria where(@Nullable Expression restriction); @Override - JpaSelectCriteria where(Predicate... restrictions); + JpaSelectCriteria where(Predicate @Nullable... restrictions); @Override JpaSelectCriteria groupBy(Expression... grouping); @@ -82,11 +83,11 @@ public interface JpaSelectCriteria extends AbstractQuery, JpaCriteriaBase JpaSelectCriteria groupBy(List> grouping); @Override - JpaPredicate getGroupRestriction(); + @Nullable JpaPredicate getGroupRestriction(); @Override - JpaSelectCriteria having(Expression restriction); + JpaSelectCriteria having(@Nullable Expression restriction); @Override - JpaSelectCriteria having(Predicate... restrictions); + JpaSelectCriteria having(Predicate @Nullable... restrictions); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSetJoin.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSetJoin.java index 88c495ab4ba4..c41c61da5745 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSetJoin.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSetJoin.java @@ -6,6 +6,7 @@ import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.metamodel.model.domain.EntityDomainType; import jakarta.persistence.criteria.Expression; @@ -20,15 +21,15 @@ public interface JpaSetJoin extends JpaPluralJoin, T>, SetJoin { @Override - JpaSetJoin on(JpaExpression restriction); + JpaSetJoin on(@Nullable JpaExpression restriction); - JpaSetJoin on(Expression restriction); + JpaSetJoin on(@Nullable Expression restriction); @Override - JpaSetJoin on(JpaPredicate... restrictions); + JpaSetJoin on(JpaPredicate @Nullable... restrictions); @Override - JpaSetJoin on(Predicate... restrictions); + JpaSetJoin on(Predicate @Nullable... restrictions); @Override JpaTreatedJoin treatAs(Class treatAsType); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSubQuery.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSubQuery.java index 347ff90bc802..955b6c1a652a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSubQuery.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaSubQuery.java @@ -18,6 +18,7 @@ import jakarta.persistence.criteria.SetJoin; import jakarta.persistence.criteria.Subquery; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.query.common.FetchClauseType; /** @@ -36,19 +37,19 @@ public interface JpaSubQuery extends Subquery, JpaSelectCriteria, JpaCr // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Limit/Offset/Fetch clause - JpaExpression getOffset(); + @Nullable JpaExpression getOffset(); - JpaSubQuery offset(JpaExpression offset); + JpaSubQuery offset(@Nullable JpaExpression offset); - JpaSubQuery offset(Number offset); + JpaSubQuery offset(@Nullable Number offset); - JpaExpression getFetch(); + @Nullable JpaExpression getFetch(); - JpaSubQuery fetch(JpaExpression fetch); + JpaSubQuery fetch(@Nullable JpaExpression fetch); JpaSubQuery fetch(JpaExpression fetch, FetchClauseType fetchClauseType); - JpaSubQuery fetch(Number fetch); + JpaSubQuery fetch(@Nullable Number fetch); JpaSubQuery fetch(Number fetch, FetchClauseType fetchClauseType); @@ -70,7 +71,7 @@ public interface JpaSubQuery extends Subquery, JpaSelectCriteria, JpaCr JpaSubQuery distinct(boolean distinct); @Override - JpaExpression getSelection(); + @Nullable JpaExpression getSelection(); @Override JpaSubQuery select(Expression expression); diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaWindowFrame.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaWindowFrame.java index 42916c5f9f1b..3c791d8429c1 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaWindowFrame.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/JpaWindowFrame.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.criteria; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.query.common.FrameKind; @@ -28,5 +29,5 @@ public interface JpaWindowFrame { * * @return the window frame expression */ - Expression getExpression(); + @Nullable Expression getExpression(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/internal/NamedCriteriaQueryMementoImpl.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/internal/NamedCriteriaQueryMementoImpl.java index 0259abd70f38..6651d19609b6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/internal/NamedCriteriaQueryMementoImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/internal/NamedCriteriaQueryMementoImpl.java @@ -69,7 +69,7 @@ public void validate(QueryEngine queryEngine) { private static void checkResultType(Class resultType, SqmSelectStatement selectStatement) { final Class expectedResultType = selectStatement.getResultType(); - if ( expectedResultType != null + if ( expectedResultType != Object.class && !resultType.isAssignableFrom( expectedResultType ) ) { throw new QueryTypeMismatchException( String.format( diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java index f7118e2280fd..2a67e5ab3625 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Incubating; import org.hibernate.query.NullPrecedence; import org.hibernate.query.SortDirection; @@ -635,7 +636,7 @@ public JpaExpression toString(Expression character) { } @Override - public JpaExpression literal(T value) { + public JpaExpression literal(@Nullable T value) { return criteriaBuilder.literal( value ); } @@ -840,7 +841,7 @@ public > JpaExpression> indexes(L list) { } @Override - public JpaExpression value(T value) { + public JpaExpression value(@Nullable T value) { return criteriaBuilder.value( value ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java index 231e0149dc71..e61e9ca118b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java @@ -1017,15 +1017,15 @@ public SqmQueryGroup visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) { if ( withClauseContext != null ) { withClauseContext.accept( this ); } + final var orderedQueryContexts = ctx.orderedQuery(); + final var setOperatorContexts = ctx.setOperator(); final SqmQueryPart firstQueryPart = - (SqmQueryPart) ctx.orderedQuery(0).accept( this ); + (SqmQueryPart) orderedQueryContexts.get( 0 ).accept( this ); SqmQueryGroup queryGroup = firstQueryPart instanceof SqmQueryGroup sqmQueryGroup ? sqmQueryGroup - : new SqmQueryGroup<>( firstQueryPart ); + : new SqmQueryGroup<>( firstQueryPart, visitSetOperator( setOperatorContexts.get( 0 ) ) ); setCurrentQueryPart( queryGroup ); - final var orderedQueryContexts = ctx.orderedQuery(); - final var setOperatorContexts = ctx.setOperator(); final SqmCreationProcessingState firstProcessingState = processingStateStack.pop(); for ( int i = 0; i < setOperatorContexts.size(); i++ ) { queryGroup = getSqmQueryGroup( @@ -3243,7 +3243,7 @@ public SqmPredicate visitLikePredicate(HqlParser.LikePredicateContext ctx) { ? asList( expression, pattern ) : asList( expression, pattern, new SqmLiteral<>( "i", - resolveExpressibleTypeBasic( String.class ), + nodeBuilder().getStringType(), nodeBuilder() ) ), @@ -3618,7 +3618,9 @@ public SqmExpression visitConcatenationExpression(HqlParser.ConcatenationExpr final SqmExpressible lhsExpressible = lhs.getExpressible(); final SqmExpressible rhsExpressible = rhs.getExpressible(); if ( lhsExpressible != null && lhsExpressible.getSqmType() instanceof BasicPluralType ) { - if ( rhsExpressible == null || rhsExpressible.getSqmType() instanceof BasicPluralType ) { + // Assume that appending null means appending a null element + if ( rhsExpressible == null && !(rhs instanceof SqmLiteralNull) + || rhsExpressible != null && rhsExpressible.getSqmType() instanceof BasicPluralType ) { // Both sides are array, so use array_concat return getFunctionDescriptor( "array_concat" ).generateSqmExpression( asList( lhs, rhs ), @@ -3636,7 +3638,8 @@ public SqmExpression visitConcatenationExpression(HqlParser.ConcatenationExpr } } else if ( rhsExpressible != null && rhsExpressible.getSqmType() instanceof BasicPluralType ) { - if ( lhsExpressible == null ) { + // Assume that prepending null means prepending a null element + if ( lhsExpressible == null && !(lhs instanceof SqmLiteralNull) ) { // The RHS is an array and the LHS doesn't have a clear type, so use array_concat return getFunctionDescriptor( "array_concat" ).generateSqmExpression( asList( lhs, rhs ), @@ -3756,7 +3759,7 @@ public Object visitToDurationExpression(HqlParser.ToDurationExpressionContext ct private SqmDurationUnit toDurationUnit(SqmExtractUnit extractUnit) { return new SqmDurationUnit<>( extractUnit.getUnit(), - resolveExpressibleTypeBasic( Long.class ), + nodeBuilder().getLongType(), nodeBuilder() ); } @@ -3768,7 +3771,7 @@ public Object visitFromDurationExpression(HqlParser.FromDurationExpressionContex return new SqmByUnit( toDurationUnit( (SqmExtractUnit) ctx.datetimeField().accept( this ) ), expression, - resolveExpressibleTypeBasic( Long.class ), + nodeBuilder().getLongType(), nodeBuilder() ); } @@ -4356,7 +4359,7 @@ private SqmLiteral