使用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
相关产品推荐
相关产品推荐

