Java集成Alfresco时OpenCMIS自定义属性排序查询报错求助
问题:Alfresco OpenCMIS 查询自定义属性排序失败
问题场景
使用OpenCMIS集成Alfresco时,自定义类型personalizedType:personalizedType包含propertyNumber和propertyString属性,执行带自定义属性排序的CMIS查询时抛出排序不支持的错误,仅原生CMIS属性(如cmis:name)排序可正常生效。
查询代码
String query = "SELECT * FROM personalizedType:personalizedType WHERE " + "personalizedType:propertyNumber like '" + number + "' AND " + "cmis:name LIKE '" + name + "' AND "+ "personalizedType:propertyString like '" + nome + "' " + "ORDER BY personalizedType:propertyString"; ItemIterable<QueryResult> results = session.query(query, false);
报错信息
org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException: Ordering is not support for personalizedType:propertyString at org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService.convertStatusCode(AbstractAtomPubService.java:490) at org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService.post(AbstractAtomPubService.java:717) at org.apache.chemistry.opencmis.client.bindings.spi.atompub.DiscoveryServiceImpl.query(DiscoveryServiceImpl.java:181) at org.apache.chemistry.opencmis.client.runtime.SessionImpl$6.fetchPage(SessionImpl.java:1000) at org.apache.chemistry.opencmis.client.runtime.util.AbstractIterator.getCurrentPage(AbstractIterator.java:131) at org.apache.chemistry.opencmis.client.runtime.util.AbstractIterator.getTotalNumItems(AbstractIterator.java:68) at org.apache.chemistry.opencmis.client.runtime.util.AbstractIterable.getTotalNumItems(AbstractIterable.java:101)
环境信息
- OpenCMIS客户端版本:1.1.0
- Java版本:17
- Maven依赖:
<dependency> <groupId>org.apache.chemistry.opencmis</groupId> <artifactId>chemistry-opencmis-client-impl</artifactId> <version>1.1.0</version> </dependency>
已尝试的排序写法
均无效,部分写法触发选择器错误:
ORDER BY personalizedType:personalizedType:propertyStringORDER BY F:personalizedType:personalizedType:propertyStringORDER BY personalizedType:@personalizedType:propertyStringORDER BY '@personalizedType:propertyString'
解决方案
1. 确保自定义属性开启索引支持
Alfresco中只有被索引的属性才能用于排序,需在数据模型XML文件中为propertyString配置索引和可分面属性:
<property name="personalizedType:propertyString"> <type>d:text</type> <index enabled="true"> <atomic>true</atomic> <stored>true</stored> <tokenised>true</tokenised> </index> <facetable>true</facetable> </property>
修改模型后重新部署Alfresco,并等待索引重建完成。
2. 验证CMIS查询语法
你最初使用的ORDER BY personalizedType:propertyString语法是正确的,格式为[命名空间]:[属性名],无需额外前缀或修饰符,问题核心在于属性是否被正确索引。
3. 手动触发Alfresco索引重建
若模型修改后索引未自动更新,可通过Alfresco管理控制台操作:
- 进入Admin Console
- 导航至
Search Service->Indexes - 执行
Reindex All操作(建议在业务低峰期执行,避免影响服务)
4. 升级OpenCMIS版本(可选)
OpenCMIS 1.1.0版本较旧,尝试升级至最新稳定版(如1.1.5)可修复部分兼容性问题:
<dependency> <groupId>org.apache.chemistry.opencmis</groupId> <artifactId>chemistry-opencmis-client-impl</artifactId> <version>1.1.5</version> </dependency>
5. 客户端侧排序(临时方案)
若上述方法均无法快速解决,可在获取查询结果后,在Java客户端完成排序(仅适用于小量结果集):
List<QueryResult> resultList = new ArrayList<>(); results.forEach(resultList::add); Collections.sort(resultList, (r1, r2) -> { String val1 = r1.getPropertyValue("personalizedType:propertyString"); String val2 = r2.getPropertyValue("personalizedType:propertyString"); return val1.compareTo(val2); });
内容的提问来源于stack exchange,提问作者Mario Henrique
相关产品推荐
相关产品推荐

