Чтобы сделать все это в одном запросе (как вы пытаетесь сделать в своем коде), вы можете создать объединение с таблицей ReferentialContainmentRelationship
. Свойство Head
этой таблицы указывает на документ, свойство Tail
указывает на папку, в которую заполнен документ, а свойство ContainmentName
- это имя документа в папке. Используйте следующий код для построения пути к документу:
SearchSQL searchSQL = new SearchSQL("SELECT R.ContainmentName, R.Tail, D.This FROM Document AS D WITH INCLUDESUBCLASSES INNER JOIN ReferentialContainmentRelationship AS R WITH INCLUDESUBCLASSES ON D.This = R.Head WHERE DocumentTitle like '%test%'");
SearchScope searchScope = new SearchScope(objectStore);
RepositoryRowSet objects = searchScope.fetchRows(searchSQL, null, null, null);
Iterator<RepositoryRow> iterator = objects.iterator();
while (iterator.hasNext()) {
RepositoryRow repositoryRow = iterator.next();
Properties properties = repositoryRow.getProperties();
Folder folder = (Folder) properties.get("Tail").getEngineObjectValue();
String containmentName = properties.get("ContainmentName").getStringValue();
System.out.println(folder.get_PathName() + "/" + containmentName);
}
Пути, построенные таким образом, также можно использовать для извлечения объекта из хранилища объектов. Код запроса можно оптимизировать, используя фильтр свойств в качестве третьего аргумента метода fetchRows()
. Не знаю, как это происходит, если документ хранится в нескольких папках.