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

使用Documentum API计算平均值后,如何正确获取自定义Double类型查询结果?

解决Documentum API获取自定义聚合Double值的报错问题

首先,你遇到的DM_API_E_BADATTRNAME错误,核心原因是Documentum的IDfCollection对于DQL聚合查询的别名字段,不会像原生对象属性那样严格映射数据类型——虽然你的DQL计算的是Double类型的平均值,但API内部可能把mediaglobale这个别名结果以字符串或者未正确注册的属性类型存储,直接调用getDouble()会因为无法识别这个"自定义属性名"而报错,而getInt()能工作是因为它内部做了宽松的类型转换逻辑。

下面是两种可靠的解决方法:

方法1:先获取字符串再转换为Double

这是最稳妥的方式,直接拿到聚合结果的字符串形式,手动转换为数值类型:

final IDfQuery checkMediaDocs = new DfQuery();
IDfCollection mediaDocs = null;
checkMediaDocs.setDQL("select sum(tot_doc_daily)/count(*) as mediaglobale from my_table");
int media = 0;
try {
    mediaDocs = checkMediaDocs.execute(session, IDfQuery.DF_READ_QUERY);
    while (mediaDocs.next()) {
        String mediaStr = mediaDocs.getString("mediaglobale");
        // 处理空值或非数值情况
        if (mediaStr != null && !mediaStr.isBlank()) {
            double mediaDouble = Double.parseDouble(mediaStr);
            media = (int) mediaDouble;
        }
    }
} catch (DfException e) {
    // 异常处理逻辑
    e.printStackTrace();
} finally {
    // 务必关闭集合释放资源
    if (mediaDocs != null && mediaDocs.isOpen()) {
        mediaDocs.close();
    }
}

方法2:通过IDfValue统一处理类型

利用Documentum的IDfValue接口来获取值,再根据实际数据类型做转换,兼容性更强:

final IDfQuery checkMediaDocs = new DfQuery();
IDfCollection mediaDocs = null;
checkMediaDocs.setDQL("select sum(tot_doc_daily)/count(*) as mediaglobale from my_table");
int media = 0;
try {
    mediaDocs = checkMediaDocs.execute(session, IDfQuery.DF_READ_QUERY);
    while (mediaDocs.next()) {
        IDfValue value = mediaDocs.getObject("mediaglobale");
        if (value != null) {
            switch (value.getDataType()) {
                case IDfValue.DF_DOUBLE:
                    media = (int) value.asDouble();
                    break;
                case IDfValue.DF_STRING:
                    media = (int) Double.parseDouble(value.asString());
                    break;
                case IDfValue.DF_INTEGER:
                    media = value.asInt();
                    break;
                // 其他可能的类型可以按需扩展
            }
        }
    }
} catch (DfException | NumberFormatException e) {
    e.printStackTrace();
} finally {
    if (mediaDocs != null && mediaDocs.isOpen()) {
        mediaDocs.close();
    }
}

另外补充一个最佳实践:永远记得在finally块中关闭IDfCollection,避免Documentum会话资源泄漏。

内容的提问来源于stack exchange,提问作者Andrea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:59:07