Для того, чтобы модифицировать предикаты, которыми оборачивается запрос из View Criteria, применяется перекрытый метод getCriteriaItemClause класса ViewObjectImpl. Например, мы можем вручную подцепить определеную bind-переменную в произвольное ограничение:
Ещё нюанс о галочке Ignore Null Values с обязательными bind-переменными:
@Override public String getCriteriaItemClause(ViewCriteriaItem aVCI) { VariableValueManager vm = this.ensureVariableManager(); ArrayListПро происходит: выполняется цикл по всем bind-переменным. Идентификация нужной переменной происходит по свойству DESCRIPTION. Если переменная найдена и она имеет значение, отличное от NULL, добавляется предикат. Иначе вызывается родительский метод.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); }
Ещё нюанс о галочке Ignore Null Values с обязательными bind-переменными:
Снятая галочка Ignore Null Values в случае с обязательными bind-переменными обеспечивает оборачивание запроса в ограничение ( = :p_var or :p_var is null) в любом случае, что в случае со сложными запросами может привести к сбиванию плана. Если галочка установлена, то ограничение добавляется только если переменная не NULL.