0

我正在使用带有 Java API 的 FileNet P8 Content Engine 5.5.x 来使用 SearchSQL 构建一个临时查询。基于 Document 类创建一个 select 语句很简单:

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);

注意:此版本与第一个版本存在相同的问题。

问题是从 Document 类中使用什么作为连接变量(“d.This”),我尝试过的所有内容都引发了某种类型的 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 类的符号名称。

4

1 回答 1

0

在阅读了大部分在线 API 文档后,仍然没有找到答案,我向 IBM Support 开了一张票。这是通过 ad-hock SQL Query API 将文档类连接到类定义类的正确方法

        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);
于 2020-10-30T23:37:49.207 回答