session.queryObjects不支持辅助类型

时间:2017-03-09 07:54:35

标签: cmis opencmis

阅读此https://chemistry.apache.org/docs/cmis-samples/samples/properties/index.html#retrieving-properties,我认为可以使用queryObjects方法检索辅助类型,但事实并非如此。例如,我试图从Alfresco获取cm:author,它返回null。这是我的代码:

OperationContext oc = OperationContextUtils.createMaximumOperationContext();
ItemIterable<CmisObject> results = session.queryObjects(task.getCmisType(), where, false, oc);

...

Object value = cmisObject.getPropertyValue("cm:author");

我错过了什么吗?

P.S:我正在使用Chemistry 1.0.0,CMIS 1.1,Binding:Browser

更新

好的,我发现了一些有趣的东西,为了检索cm:author,我必须重新加载cmisObject才能使它工作:

results = session.queryObjects("cmis:document", "IN_FOLDER('" + folder.getId() + "')", false, oc);
results.each { it -> 
    object = session.getObject(it.getId()); 
    author = object.getPropertyValue("cm:author"); 

    if(author != null) { 
        println object.getId() + " => " + author; 
    } 

错误?

1 个答案:

答案 0 :(得分:2)

首先确保cm:author是你想要的。那不是在Alfresco中创建文档节点的人。这是一个可编辑的属性,任何人都可以设置为任何东西,默认情况下它是null。

如果你想要的是创建文档节点的人的实际用户名,你应该使用cmis:createdBy,它被映射到alfresco的cm:creator属性。

假设cm:作者绝对是你想要的,你有两个选择如何获得它。首先,您可以从对象中获取它。但是为了从对象中获取它,您必须首先获取对象。您的查询返回QueryResult对象,而不是CmisObjects。

所以你应该这样做:

ItemIterable<QueryResult> results = session.query(queryString, false);
for (QueryResult qResult : results) {
    String objectId = "";
    PropertyData<?> propData = qResult.getPropertyById("cmis:objectId"); 
    if (propData != null) {
        objectId = (String) propData.getFirstValue();
    }
    CmisObject obj = session.getObject(session.createObjectId(objectId));
    // Dump the object here
    System.out.println("Author: " + obj.getPropertyValue("cm:author");
}

您的第二个选择是从查询结果中获取属性值。您执行此操作的能力取决于您运行的查询。 author属性是在一个方面定义的,因此您必须进行连接才能将其恢复。查询可能类似于:

queryString = "select content.cmis:name, content.cmis:objectId, author.cm:author from cmis:document content JOIN cm:author author ON content.cmis:objectId = author.cmis:objectId WHERE content.cmis:objectId is not null AND author.cm:author = 'Jeff'";

如果您使用该查询,那么您可以使用QueryResult获取作者,如下所示:

System.out.println("Author: " + qResult.getPropertyValueByQueryName("author.cm:author"));

希望这解释了从查询结果中获取值和从对象本身获取属性值之间的区别。