session.queryObjects не поддерживает вторичные типы

Читая это https://chemistry.apache.org/docs/cmis-samples/samples/properties/index.html#retrieving-properties, я думал, что можно получить вторичные типы с помощью метода queryObjects, но это не так. Например, я пытаюсь получить cm:author от Alfresco, он возвращает 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; 
    } 

Ошибка?


person Rapster    schedule 09.03.2017    source источник
comment
Пробовали ли вы использовать Chemistry Workbench, чтобы увидеть, какие именно свойства вы возвращаете и какие префиксы применяются к ним?   -  person Gagravarr    schedule 09.03.2017
comment
Надеемся, что @florian-müller будет рядом, чтобы дать совет!   -  person Gagravarr    schedule 10.03.2017
comment
Поставщик репозитория, версия и URL службы, пожалуйста.   -  person Jeff Potts    schedule 13.03.2017


Ответы (1)


Сначала убедитесь, что cm:author — это то, что вам нужно. Это не тот человек, который создал узел документа в Alfresco. Это редактируемое свойство, которое любой может установить на что угодно, и по умолчанию оно равно null.

Если вам нужно фактическое имя пользователя, создавшего узел документа, вы должны использовать cmis:createdBy, который сопоставляется со свойством cm:creator alfresco.

Предполагая, что cm:author — это именно то, что вам нужно, у вас есть два варианта, как его получить. Во-первых, вы можете получить его от объекта. Но для того, чтобы получить его от объекта, вы должны сначала получить объект. Ваш запрос возвращает объекты 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");
}

Второй вариант — получить значение свойства из результата запроса. Ваша способность сделать это зависит от запроса, который вы выполнили. Свойство автора определено для аспекта, поэтому вы должны выполнить соединение, чтобы получить его обратно. Запрос может выглядеть примерно так:

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

Надеюсь, это объясняет разницу между получением значения из результата запроса и получением значения свойства из самого объекта.

person Jeff Potts    schedule 13.03.2017
comment
Спасибо, Джефф, 1/ Вот URL-адрес: cmis. alfresco.com/api/-default-/public/cmis/versions/1.1/, остальное уже указано 2/ Использую метод queryObjects(), результат - набор CmisObject. См. chemistry.apache.org/docs/cmis-samples/samples. /queries/ Итак, еще раз, почему я должен перезагружать тот же объект, делая это object = session.getObject(it.getId());? - person Rapster; 14.03.2017
comment
Как говорится, похоже, что метод query() предлагает больше возможностей, он фактически поддерживает JOIN, поэтому вы можете сделать свой выбор более строгим. Например: SELECT * FROM cmis:document D JOIN cm:author P ON P.cmis:objectId = D.cmis:objectId WHERE IN_FOLDER(D, '5be4b981-c2a7-48cf-8b89-a5bb99bc0f05') AND P.cm:author IS NOT NULL я не думаю, что можно сделать то же самое с помощью queryObjects(), кроме как выполнить пост-обработку в Java. - person Rapster; 14.03.2017
comment
Понятия не имею, что касается проблемы? :/ - person Rapster; 17.03.2017
comment
Точно так же, как вы не можете получить автора без объединения, если вы должны были сделать свой собственный запрос (что-то вроде выбора * из cmis:document), вы не можете получить свойства, определенные аспектом, через queryObjects, потому что он также не выполняет соединение. - person Jeff Potts; 18.03.2017
comment
Да, действительно... Но что касается изначальной проблемы этого поста, разве вы не видите здесь проблемы? - person Rapster; 19.03.2017
comment
Нет, я думаю, Alfresco скажет вам, что работает так, как задумано, и я думаю, что Apache Chemistry посоветует вам поговорить с Alfresco. Но не стесняйтесь отправить вопрос в рассылку Apache Chemistry и узнать, что думают другие разработчики. - person Jeff Potts; 21.03.2017