Как присоединить объекты Document и ClassDefinition при использовании SearchSQL?

Я использую FileNet P8 Content Engine 5.5.x с Java API для создания специального запроса с использованием SearchSQL. Создать оператор выбора на основе класса Document очень просто:

SearchSQL sql = new SearchSQL();
String selectList = "d.This, d.Id, d.Name, d.ClassDescription";
sql.setSelectList(selectList);
sql.setFromClauseInitialValue("Document", "d", true);
SearchScope scope = new SearchScope(conn.getObjectStore());
RepositoryRowSet rows = scope.fetchRows(sql, 8, null, null);

Примечание. В приведенном выше утверждении используется объект ClassDescription, который вы "могли" использовать, но для перехода к SymbolicName потребуется перемещаться по объекту. Вы также должны быть осторожны и создать фильтр свойств, чтобы не вызывать возврат на сервер.

Однако добавление соединения к классу ClassDefinition не удалось:

SearchSQL sql = new SearchSQL();
String selectList = "d.This, d.Id, d.Name, d.ClassDescription";
sql.setSelectList(selectList);
sql.setFromClauseInitialValue("Document", "d", true);
sql.setFromClauseAdditionalJoin(JoinOperator.INNER,"ClassDefinition","cd","d.This", JoinComparison.EQUAL,"cd.Id",false);
SearchScope scope = new SearchScope(conn.getObjectStore());
RepositoryRowSet rows = scope.fetchRows(sql, 8, null, null);

Примечание. Эта версия страдает той же проблемой, что и первая.

Проблема в том, что использовать в качестве переменной соединения ("d.This") из класса Document, все, что я пробовал, вызвало какой-то тип исключения синтаксиса SQL. Самое интересное в том, что, если бы у меня был доступ к базе данных Oracle, я считаю, что соединение будет простым.

SELECT dv.object_id, dv.u2e_documenttitle, cd.symbolic_name 
FROM DocVersion dv 
INNER JOIN ClassDefinition cd ON
dv.object_class_id = cd.object_id

В конце концов, я пытаюсь получить символическое имя класса ClassDefinition в возвращаемом наборе результатов.

1 ответ

Решение

Прочитав большую часть онлайн-документации по API и так и не придя к ответу, я открыл заявку в службу поддержки IBM. Вот правильный способ присоединить класс документа к классу определения класса через специальный API запросов SQL

        var sql = new SearchSQL();

        sql.setFromClauseInitialValue("Document", "d", true);
        sql.setFromClauseAdditionalJoin(JoinOperator.INNER, "ClassDefinition","cd","d.ClassDescription", JoinComparison.EQUAL,"cd.This",true);

        var scope = new SearchScope(os);
        var pf = new PropertyFilter();
        pf.addIncludeProperty(new FilterElement(1, null, null, PropertyNames.THIS, null));
        pf.addIncludeProperty(new FilterElement(1, null, null, PropertyNames.ID, null));
        pf.addIncludeProperty(new FilterElement(1, null, null, "DocumentTitle", null));
        pf.addIncludeProperty(new FilterElement(1, null, null, PropertyNames.MIME_TYPE, null));
        pf.addIncludeProperty(new FilterElement(1, null, null, PropertyNames.DATE_CREATED, null));
        pf.addIncludeProperty(new FilterElement(1, null, null, PropertyNames.SYMBOLIC_NAME, null));
        pf.addIncludeProperty(new FilterElement(1, null, Boolean.FALSE, PropertyNames.CLASS_DESCRIPTION, null));
        pf.addIncludeProperty(new FilterElement(1, null, Boolean.FALSE, PropertyNames.CLASS_DEFINITION, null));
        pf.addIncludeProperty(new FilterElement(1, null, Boolean.FALSE, PropertyNames.PROPERTY_DEFINITIONS, null));
        pf.addIncludeProperty(new FilterElement(1, null, null, PropertyNames.CONTENT_ELEMENTS_PRESENT, null));

        RepositoryRowSet rows = scope.fetchRows(sql, 256, pf, null);
Другие вопросы по тегам