diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 0d5260a81e..a3ce46a726 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -28,6 +28,7 @@ import java.util.TreeMap; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Supplier; +import java.util.stream.Collectors; import org.hibernate.AssertionFailure; import org.hibernate.FetchMode; @@ -3208,21 +3209,26 @@ public abstract class AbstractEntityPersister } if ( containsNotNull ) { - final StringBuilder sb = new StringBuilder(); - String lhs; + final String lhs; if ( isDiscriminatorFormula() ) { lhs = StringHelper.replace( getDiscriminatorFormulaTemplate(), Template.TEMPLATE, alias ); } else { lhs = qualifyConditionally( alias, getDiscriminatorColumnName() ); } - sb.append( " or " ).append( lhs ).append( " is not in (" ); - for ( Object discriminatorSQLValue : discriminatorSQLValues ) { - if ( !frag.getValues().contains( discriminatorSQLValue ) ) { - sb.append( lhs ).append( discriminatorSQLValue ); + final List actualDiscriminatorSQLValues = new ArrayList<>( discriminatorSQLValues.size() ); + for ( String value : discriminatorSQLValues ) { + if ( !frag.getValues().contains( value ) && !InFragment.NULL.equals( value ) ) { + actualDiscriminatorSQLValues.add( value ); } } - sb.append( ") and " ).append( lhs ).append( " is not null" ); + final StringBuilder sb = new StringBuilder( 70 + actualDiscriminatorSQLValues.size() * 10 ).append( " or " ); + if ( !actualDiscriminatorSQLValues.isEmpty() ) { + sb.append( lhs ).append( " is not in (" ); + sb.append( String.join( ",", actualDiscriminatorSQLValues ) ); + sb.append( ") and " ); + } + sb.append( lhs ).append( " is not null" ); frag.getValues().remove( InFragment.NOT_NULL ); return frag.toFragmentString() + sb; } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java index d8d6199df4..c2898a488d 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java @@ -677,7 +677,8 @@ public class SingleTableEntityPersister extends AbstractEntityPersister { // Filtering for abstract entities makes no sense, so ignore that // Also, it makes no sense to filter for any of the super types, // as the query will contain a filter for that already anyway - if ( !persister.isAbstract() && !isTypeOrSuperType( persister ) && useKind == EntityNameUse.UseKind.TREAT ) { + if ( useKind == EntityNameUse.UseKind.TREAT && !persister.isAbstract() + && ( getSuperMappingType() == null || !getSuperMappingType().isTypeOrSuperType( persister ) ) ) { containsTreatUse = true; break; }