use of org.hibernate.sql.ast.tree.predicate.NegatedPredicate in project hibernate-orm by hibernate.
the class SingleTableEntityPersister method createDiscriminatorPredicate.
private Predicate createDiscriminatorPredicate(String alias, TableGroup tableGroup, SqlExpressionResolver sqlExpressionResolver) {
final String columnReferenceKey;
final String discriminatorExpression;
if (isDiscriminatorFormula()) {
discriminatorExpression = getDiscriminatorFormulaTemplate();
columnReferenceKey = SqlExpressionResolver.createColumnReferenceKey(tableGroup.getPrimaryTableReference(), getDiscriminatorFormulaTemplate());
} else {
discriminatorExpression = getDiscriminatorColumnName();
columnReferenceKey = SqlExpressionResolver.createColumnReferenceKey(tableGroup.getPrimaryTableReference(), getDiscriminatorColumnName());
}
final BasicType<?> discriminatorType = (BasicType<?>) getDiscriminatorType();
final Expression sqlExpression = sqlExpressionResolver.resolveSqlExpression(columnReferenceKey, sqlAstProcessingState -> new ColumnReference(alias, discriminatorExpression, isDiscriminatorFormula(), null, null, discriminatorType.getJdbcMapping(), getFactory()));
if (hasSubclasses()) {
final List<Expression> values = new ArrayList<>(fullDiscriminatorValues.length);
boolean hasNull = false, hasNonNull = false;
for (Object discriminatorValue : fullDiscriminatorValues) {
if (discriminatorValue == DiscriminatorHelper.NULL_DISCRIMINATOR) {
hasNull = true;
} else if (discriminatorValue == DiscriminatorHelper.NOT_NULL_DISCRIMINATOR) {
hasNonNull = true;
} else {
values.add(new QueryLiteral<>(discriminatorValue, discriminatorType));
}
}
final Predicate p = new InListPredicate(sqlExpression, values);
if (hasNull || hasNonNull) {
final Junction junction = new Junction(Junction.Nature.DISJUNCTION);
// so we return an empty Junction
if (hasNull && hasNonNull) {
return junction;
}
junction.add(new NullnessPredicate(sqlExpression));
junction.add(p);
return junction;
}
return p;
}
final Object value = getDiscriminatorValue();
final boolean hasNotNullDiscriminator = value == DiscriminatorHelper.NOT_NULL_DISCRIMINATOR;
final boolean hasNullDiscriminator = value == DiscriminatorHelper.NULL_DISCRIMINATOR;
if (hasNotNullDiscriminator || hasNullDiscriminator) {
final NullnessPredicate nullnessPredicate = new NullnessPredicate(sqlExpression);
if (hasNotNullDiscriminator) {
return new NegatedPredicate(nullnessPredicate);
}
return nullnessPredicate;
}
return new ComparisonPredicate(sqlExpression, ComparisonOperator.EQUAL, new QueryLiteral<>(value, discriminatorType));
}
Aggregations