117117import org .hibernate .internal .FilterHelper ;
118118import org .hibernate .internal .util .IndexedConsumer ;
119119import org .hibernate .internal .util .LazyValue ;
120+ import org .hibernate .internal .util .MarkerObject ;
120121import org .hibernate .internal .util .StringHelper ;
121122import org .hibernate .internal .util .collections .ArrayHelper ;
122- import org .hibernate .internal .util .collections .CollectionHelper ;
123123import org .hibernate .internal .util .collections .LockModeEnumMap ;
124124import org .hibernate .jdbc .Expectation ;
125125import org .hibernate .jdbc .TooManyRowsAffectedException ;
158158import org .hibernate .metamodel .mapping .AttributeMapping ;
159159import org .hibernate .metamodel .mapping .AttributeMappingsList ;
160160import org .hibernate .metamodel .mapping .AttributeMappingsMap ;
161- import org .hibernate .metamodel .mapping .AttributeMetadata ;
162161import org .hibernate .metamodel .mapping .DiscriminatorConverter ;
163162import org .hibernate .metamodel .mapping .DiscriminatorType ;
164163import org .hibernate .metamodel .mapping .EmbeddableValuedModelPart ;
253252import org .hibernate .sql .ast .tree .predicate .ComparisonPredicate ;
254253import org .hibernate .sql .ast .tree .predicate .InListPredicate ;
255254import org .hibernate .sql .ast .tree .predicate .Junction ;
256- import org .hibernate .sql .ast .tree .predicate .NegatedPredicate ;
257255import org .hibernate .sql .ast .tree .predicate .NullnessPredicate ;
258256import org .hibernate .sql .ast .tree .predicate .Predicate ;
259257import org .hibernate .sql .ast .tree .select .QuerySpec ;
313311import static org .hibernate .internal .util .collections .CollectionHelper .combine ;
314312import static org .hibernate .internal .util .collections .CollectionHelper .isNotEmpty ;
315313import static org .hibernate .internal .util .collections .CollectionHelper .setOfSize ;
314+ import static org .hibernate .internal .util .collections .CollectionHelper .toSmallList ;
316315import static org .hibernate .loader .ast .internal .MultiKeyLoadHelper .supportsSqlArrayType ;
317316import static org .hibernate .metamodel .RepresentationMode .POJO ;
318317import static org .hibernate .persister .entity .DiscriminatorHelper .NOT_NULL_DISCRIMINATOR ;
@@ -905,27 +904,25 @@ else if ( entityMetamodel.isMutable() ) {
905904 }
906905 }
907906
907+ private static CacheLayout queryCacheLayout (CacheLayout entityQueryCacheLayout , SessionFactoryOptions options ) {
908+ return entityQueryCacheLayout == null ? options .getQueryCacheLayout () : entityQueryCacheLayout ;
909+ }
910+
908911 private boolean shouldUseShallowCacheLayout (CacheLayout entityQueryCacheLayout , SessionFactoryOptions options ) {
909- final CacheLayout queryCacheLayout ;
910- if ( entityQueryCacheLayout == null ) {
911- queryCacheLayout = options .getQueryCacheLayout ();
912- }
913- else {
914- queryCacheLayout = entityQueryCacheLayout ;
912+ switch ( queryCacheLayout ( entityQueryCacheLayout , options ) ) {
913+ case FULL :
914+ return false ;
915+ case AUTO :
916+ return canUseReferenceCacheEntries ()
917+ || canReadFromCache ();
918+ default :
919+ return true ;
915920 }
916- return queryCacheLayout == CacheLayout .SHALLOW || queryCacheLayout == CacheLayout .SHALLOW_WITH_DISCRIMINATOR
917- || queryCacheLayout == CacheLayout .AUTO && ( canUseReferenceCacheEntries () || canReadFromCache () );
918921 }
919922
920- private boolean shouldStoreDiscriminatorInShallowQueryCacheLayout (CacheLayout entityQueryCacheLayout , SessionFactoryOptions options ) {
921- final CacheLayout queryCacheLayout ;
922- if ( entityQueryCacheLayout == null ) {
923- queryCacheLayout = options .getQueryCacheLayout ();
924- }
925- else {
926- queryCacheLayout = entityQueryCacheLayout ;
927- }
928- return queryCacheLayout == CacheLayout .SHALLOW_WITH_DISCRIMINATOR ;
923+ private static boolean shouldStoreDiscriminatorInShallowQueryCacheLayout (
924+ CacheLayout entityQueryCacheLayout , SessionFactoryOptions options ) {
925+ return queryCacheLayout ( entityQueryCacheLayout , options ) == CacheLayout .SHALLOW_WITH_DISCRIMINATOR ;
929926 }
930927
931928 protected abstract String [] getSubclassTableNames ();
@@ -1170,10 +1167,10 @@ public boolean hasFilterForLoadByKey() {
11701167
11711168 @ Override
11721169 public Iterable <UniqueKeyEntry > uniqueKeyEntries () {
1173- if ( this . uniqueKeyEntries == null ) {
1174- this . uniqueKeyEntries = initUniqueKeyEntries ( this );
1170+ if ( uniqueKeyEntries == null ) {
1171+ uniqueKeyEntries = initUniqueKeyEntries ( this );
11751172 }
1176- return this . uniqueKeyEntries ;
1173+ return uniqueKeyEntries ;
11771174 }
11781175
11791176 private static List <UniqueKeyEntry > initUniqueKeyEntries (final AbstractEntityPersister aep ) {
@@ -1192,7 +1189,7 @@ private static List<UniqueKeyEntry> initUniqueKeyEntries(final AbstractEntityPer
11921189 }
11931190 }
11941191 }
1195- return CollectionHelper . toSmallList ( uniqueKeys );
1192+ return toSmallList ( uniqueKeys );
11961193 }
11971194
11981195 protected Map <String , SingleIdArrayLoadPlan > getLazyLoadPlanByFetchGroup () {
@@ -1230,7 +1227,7 @@ private SingleIdArrayLoadPlan createLazyLoadPlan(List<LazyAttributeDescriptor> f
12301227 return null ;
12311228 }
12321229 else {
1233- JdbcParametersList .Builder jdbcParametersBuilder = JdbcParametersList .newBuilder ();
1230+ final JdbcParametersList .Builder jdbcParametersBuilder = JdbcParametersList .newBuilder ();
12341231 final SelectStatement select = LoaderSelectBuilder .createSelect (
12351232 this ,
12361233 partsToSelect ,
@@ -1242,12 +1239,11 @@ private SingleIdArrayLoadPlan createLazyLoadPlan(List<LazyAttributeDescriptor> f
12421239 jdbcParametersBuilder ::add ,
12431240 factory
12441241 );
1245- JdbcParametersList jdbcParameters = jdbcParametersBuilder .build ();
12461242 return new SingleIdArrayLoadPlan (
12471243 this ,
12481244 getIdentifierMapping (),
12491245 select ,
1250- jdbcParameters ,
1246+ jdbcParametersBuilder . build () ,
12511247 LockOptions .NONE ,
12521248 factory
12531249 );
@@ -2921,17 +2917,16 @@ private Predicate createDisciminatorPredicate(BasicType<?> discriminatorType, Ex
29212917 return new NullnessPredicate ( sqlExpression );
29222918 }
29232919 else if ( value == NOT_NULL_DISCRIMINATOR ) {
2924- return new NegatedPredicate ( new NullnessPredicate ( sqlExpression ) );
2920+ return new NullnessPredicate ( sqlExpression , true );
29252921 }
29262922 else {
2927- final QueryLiteral < Object > literal = new QueryLiteral <>( value , discriminatorType );
2928- return new ComparisonPredicate ( sqlExpression , ComparisonOperator . EQUAL , literal );
2923+ return new ComparisonPredicate ( sqlExpression , ComparisonOperator . EQUAL ,
2924+ new QueryLiteral <>( value , discriminatorType ) );
29292925 }
29302926 }
29312927 }
29322928
29332929 private Predicate createInListPredicate (BasicType <?> discriminatorType , Expression sqlExpression ) {
2934- final List <Expression > values = new ArrayList <>( fullDiscriminatorValues .length );
29352930 boolean hasNull = false , hasNonNull = false ;
29362931 for ( Object discriminatorValue : fullDiscriminatorValues ) {
29372932 if ( discriminatorValue == NULL_DISCRIMINATOR ) {
@@ -2940,43 +2935,48 @@ private Predicate createInListPredicate(BasicType<?> discriminatorType, Expressi
29402935 else if ( discriminatorValue == NOT_NULL_DISCRIMINATOR ) {
29412936 hasNonNull = true ;
29422937 }
2943- else {
2944- values .add ( new QueryLiteral <>( discriminatorValue , discriminatorType ) );
2945- }
29462938 }
2947- final Predicate predicate = new InListPredicate ( sqlExpression , values );
2948- if ( hasNull || hasNonNull ) {
2939+ if ( hasNull && hasNonNull ) {
2940+ // This means we need to select all rows,
2941+ // and so we don't need a predicate at all
2942+ // Just return an empty Junction
2943+ return new Junction ( Junction .Nature .DISJUNCTION );
2944+ }
2945+ else if ( hasNonNull ) {
2946+ // we need every row with a non-null discriminator
2947+ return new NullnessPredicate ( sqlExpression , true );
2948+ }
2949+ else if ( hasNull ) {
29492950 final Junction junction = new Junction ( Junction .Nature .DISJUNCTION );
2951+ junction .add ( new NullnessPredicate ( sqlExpression ) );
2952+ junction .add ( discriminatorValuesPredicate ( discriminatorType , sqlExpression ) );
2953+ return junction ;
2954+ }
2955+ else {
2956+ return discriminatorValuesPredicate ( discriminatorType , sqlExpression );
2957+ }
2958+ }
29502959
2951- if ( hasNull && hasNonNull ) {
2952- // This means we need to select everything, we don't need a predicate at all
2953- // Return an empty Junction
2954- return junction ;
2955- }
2956-
2957- if ( hasNonNull ) {
2958- return new NullnessPredicate ( sqlExpression , true );
2959- }
2960- else if ( hasNull ) {
2961- junction .add ( new NullnessPredicate ( sqlExpression ) );
2960+ private InListPredicate discriminatorValuesPredicate (BasicType <?> discriminatorType , Expression sqlExpression ) {
2961+ final List <Expression > values = new ArrayList <>( fullDiscriminatorValues .length );
2962+ for ( Object discriminatorValue : fullDiscriminatorValues ) {
2963+ if ( !(discriminatorValue instanceof MarkerObject ) ) {
2964+ values .add ( new QueryLiteral <>( discriminatorValue , discriminatorType ) );
29622965 }
2963-
2964- junction .add ( predicate );
2965- return junction ;
29662966 }
2967- return predicate ;
2967+ return new InListPredicate ( sqlExpression , values ) ;
29682968 }
29692969
29702970 protected String getPrunedDiscriminatorPredicate (
29712971 Map <String , EntityNameUse > entityNameUses ,
29722972 MappingMetamodelImplementor mappingMetamodel ,
29732973 String alias ) {
2974- final InFragment frag = new InFragment ();
2974+ final InFragment fragment = new InFragment ();
29752975 if ( isDiscriminatorFormula () ) {
2976- frag .setFormula ( alias , getDiscriminatorFormulaTemplate () );
2976+ fragment .setFormula ( alias , getDiscriminatorFormulaTemplate () );
29772977 }
29782978 else {
2979- frag .setColumn ( alias , getDiscriminatorColumnName () );
2979+ fragment .setColumn ( alias , getDiscriminatorColumnName () );
29802980 }
29812981 boolean containsNotNull = false ;
29822982 for ( Map .Entry <String , EntityNameUse > entry : entityNameUses .entrySet () ) {
@@ -2991,11 +2991,12 @@ protected String getPrunedDiscriminatorPredicate(
29912991 // as the query will contain a filter for that already anyway
29922992 if ( !persister .isAbstract () && ( this == persister || !isTypeOrSuperType ( persister ) ) ) {
29932993 containsNotNull = containsNotNull || InFragment .NOT_NULL .equals ( persister .getDiscriminatorSQLValue () );
2994- frag .addValue ( persister .getDiscriminatorSQLValue () );
2994+ fragment .addValue ( persister .getDiscriminatorSQLValue () );
29952995 }
29962996 }
2997- final List <String > discriminatorSQLValues = Arrays .asList ( ( (AbstractEntityPersister ) getRootEntityDescriptor () ).fullDiscriminatorSQLValues );
2998- if ( frag .getValues ().size () == discriminatorSQLValues .size () ) {
2997+ final AbstractEntityPersister rootEntityDescriptor = (AbstractEntityPersister ) getRootEntityDescriptor ();
2998+ final List <String > discriminatorSQLValues = Arrays .asList ( rootEntityDescriptor .fullDiscriminatorSQLValues );
2999+ if ( fragment .getValues ().size () == discriminatorSQLValues .size () ) {
29993000 // Nothing to prune if we filter for all subtypes
30003001 return null ;
30013002 }
@@ -3010,7 +3011,7 @@ protected String getPrunedDiscriminatorPredicate(
30103011 }
30113012 final List <String > actualDiscriminatorSQLValues = new ArrayList <>( discriminatorSQLValues .size () );
30123013 for ( String value : discriminatorSQLValues ) {
3013- if ( !frag .getValues ().contains ( value ) && !InFragment .NULL .equals ( value ) ) {
3014+ if ( !fragment .getValues ().contains ( value ) && !InFragment .NULL .equals ( value ) ) {
30143015 actualDiscriminatorSQLValues .add ( value );
30153016 }
30163017 }
@@ -3021,11 +3022,11 @@ protected String getPrunedDiscriminatorPredicate(
30213022 sb .append ( ") and " );
30223023 }
30233024 sb .append ( lhs ).append ( " is not null" );
3024- frag .getValues ().remove ( InFragment .NOT_NULL );
3025- return frag .toFragmentString () + sb ;
3025+ fragment .getValues ().remove ( InFragment .NOT_NULL );
3026+ return fragment .toFragmentString () + sb ;
30263027 }
30273028 else {
3028- return frag .toFragmentString ();
3029+ return fragment .toFragmentString ();
30293030 }
30303031 }
30313032
0 commit comments