15.09.2016

Модификация запроса View Criteria в runtime

Для того, чтобы модифицировать предикаты, которыми оборачивается запрос из View Criteria, применяется перекрытый метод getCriteriaItemClause класса ViewObjectImpl. Например, мы можем вручную подцепить определеную 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.