use of org.hibernate.sql.ast.tree.predicate.NullnessPredicate in project hibernate-orm by hibernate.
the class SimpleNaturalIdLoader method applyNaturalIdRestriction.
@Override
protected void applyNaturalIdRestriction(Object bindValue, TableGroup rootTableGroup, Consumer<Predicate> predicateConsumer, BiConsumer<JdbcParameter, JdbcParameterBinding> jdbcParameterConsumer, LoaderSqlAstCreationState sqlAstCreationState, SharedSessionContractImplementor session) {
if (bindValue == null) {
naturalIdMapping().getAttribute().forEachSelectable((index, selectable) -> {
final Expression columnReference = resolveColumnReference(rootTableGroup, selectable, sqlAstCreationState.getSqlExpressionResolver(), session.getFactory());
predicateConsumer.accept(new NullnessPredicate(columnReference));
});
} else {
naturalIdMapping().getAttribute().breakDownJdbcValues(bindValue, (jdbcValue, jdbcValueMapping) -> {
final Expression columnReference = resolveColumnReference(rootTableGroup, jdbcValueMapping, sqlAstCreationState.getSqlExpressionResolver(), session.getFactory());
if (jdbcValue == null) {
predicateConsumer.accept(new NullnessPredicate(columnReference));
} else {
final JdbcParameter jdbcParameter = new JdbcParameterImpl(jdbcValueMapping.getJdbcMapping());
final ComparisonPredicate predicate = new ComparisonPredicate(columnReference, ComparisonOperator.EQUAL, jdbcParameter);
predicateConsumer.accept(predicate);
jdbcParameterConsumer.accept(jdbcParameter, new JdbcParameterBindingImpl(jdbcValueMapping.getJdbcMapping(), jdbcValue));
}
}, session);
}
}
use of org.hibernate.sql.ast.tree.predicate.NullnessPredicate in project hibernate-orm by hibernate.
the class CompoundNaturalIdLoader method applyNaturalIdRestriction.
@Override
protected void applyNaturalIdRestriction(Object bindValue, TableGroup rootTableGroup, Consumer<Predicate> predicateConsumer, BiConsumer<JdbcParameter, JdbcParameterBinding> jdbcParameterConsumer, LoaderSqlAstCreationState sqlAstCreationState, SharedSessionContractImplementor session) {
final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver();
final SessionFactoryImplementor factory = session.getFactory();
if (bindValue == null) {
final List<SingularAttributeMapping> naturalIdAttributes = naturalIdMapping().getNaturalIdAttributes();
for (int i = 0; i < naturalIdAttributes.size(); i++) {
naturalIdAttributes.get(i).forEachSelectable((index, selectable) -> {
final Expression columnRef = resolveColumnReference(rootTableGroup, selectable, sqlExpressionResolver, factory);
predicateConsumer.accept(new NullnessPredicate(columnRef));
});
}
// EARLY EXIT!!
return;
}
naturalIdMapping().breakDownJdbcValues(bindValue, (jdbcValue, jdbcValueMapping) -> {
final Expression columnReference = resolveColumnReference(rootTableGroup, jdbcValueMapping, sqlExpressionResolver, factory);
if (jdbcValue == null) {
predicateConsumer.accept(new NullnessPredicate(columnReference));
} else {
final JdbcParameter jdbcParameter = new JdbcParameterImpl(jdbcValueMapping.getJdbcMapping());
final ComparisonPredicate predicate = new ComparisonPredicate(columnReference, ComparisonOperator.EQUAL, jdbcParameter);
predicateConsumer.accept(predicate);
jdbcParameterConsumer.accept(jdbcParameter, new JdbcParameterBindingImpl(jdbcValueMapping.getJdbcMapping(), jdbcValue));
}
}, session);
}
use of org.hibernate.sql.ast.tree.predicate.NullnessPredicate in project hibernate-orm by hibernate.
the class CaseStatementDiscriminatorMappingImpl method createCaseSearchedExpression.
private Expression createCaseSearchedExpression(TableGroup entityTableGroup) {
return new SelfRenderingExpression() {
CaseSearchedExpression caseSearchedExpression;
@Override
public void renderToSql(SqlAppender sqlAppender, SqlAstTranslator<?> walker, SessionFactoryImplementor sessionFactory) {
if (caseSearchedExpression == null) {
// todo (6.0): possible optimization is to omit cases for table reference joins, that touch a super class, where a subclass is inner joined due to pruning
caseSearchedExpression = new CaseSearchedExpression(CaseStatementDiscriminatorMappingImpl.this);
tableDiscriminatorDetailsMap.forEach((tableName, tableDiscriminatorDetails) -> {
final TableReference tableReference = entityTableGroup.getTableReference(entityTableGroup.getNavigablePath(), tableName, false, false);
if (tableReference == null) {
// assume this is because it is a table that is not part of the processing entity's sub-hierarchy
return;
}
final Predicate predicate = new NullnessPredicate(new ColumnReference(tableReference, tableDiscriminatorDetails.getCheckColumnName(), false, null, null, getJdbcMapping(), getSessionFactory()), true);
caseSearchedExpression.when(predicate, new QueryLiteral<>(tableDiscriminatorDetails.getDiscriminatorValue(), getUnderlyingJdbcMappingType()));
});
}
caseSearchedExpression.accept(walker);
}
@Override
public JdbcMappingContainer getExpressionType() {
return CaseStatementDiscriminatorMappingImpl.this;
}
};
}
use of org.hibernate.sql.ast.tree.predicate.NullnessPredicate 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