Для того, чтобы модифицировать предикаты, которыми оборачивается запрос из View Criteria, применяется перекрытый метод getCriteriaItemClause класса ViewObjectImpl. Например, мы можем вручную подцепить определеную bind-переменную в произвольное ограничение:
Ещё нюанс о галочке Ignore Null Values с обязательными bind-переменными:
@Override
public String getCriteriaItemClause(ViewCriteriaItem aVCI) {
VariableValueManager vm = this.ensureVariableManager();
ArrayList criteriaList = aVCI.getValues();
for (ViewCriteriaItemValue itemValue : criteriaList) {
if (itemValue.getIsBindVar()) {
Variable bindVariable = itemValue.getBindVariable();
Object variableValue = vm.getVariableValue(bindVariable);
// check for the special DESCRIPTION in the used bind variable
Object descProperty = bindVariable.getProperty("DESCRIPTION");
String description = (descProperty != null ? descProperty.toString() : "null");
if ("NAME".equalsIgnoreCase(description)) {
if (aVCI.getViewCriteria().getRootViewCriteria().isCriteriaForQuery()) {
if (variableValue != null) {
return "EMP.NAME LIKE ('%' || :p_name || '%')";
}
}
}
}
}
return super.getCriteriaItemClause(aVCI);
}
Про происходит: выполняется цикл по всем bind-переменным. Идентификация нужной переменной происходит по свойству DESCRIPTION. Если переменная найдена и она имеет значение, отличное от NULL, добавляется предикат. Иначе вызывается родительский метод.Ещё нюанс о галочке Ignore Null Values с обязательными bind-переменными:
Снятая галочка Ignore Null Values в случае с обязательными bind-переменными обеспечивает оборачивание запроса в ограничение ( = :p_var or :p_var is null) в любом случае, что в случае со сложными запросами может привести к сбиванию плана. Если галочка установлена, то ограничение добавляется только если переменная не NULL.