You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:propertyString
  • ORDER BY F:personalizedType:personalizedType:propertyString
  • ORDER BY personalizedType:@personalizedType:propertyString
  • ORDER 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管理控制台操作:

  1. 进入Admin Console
  2. 导航至Search Service -> Indexes
  3. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:33:31