使用UniObject Java调用selectMatchingAK查询备用索引时RPC失败
我看到你在用UniObject for Java通过备用索引查询记录时遇到了RPC失败的错误,但同样的逻辑在TCL里却能正常运行,咱们一步步来排查问题:
先回顾你的问题场景
你的代码:
UniFile uFile = uSession.open("EC_WORK_ORDER_REQUEST_STATUS"); UniSelectList uSelect = uSession.selectList(0); uSelect.selectMatchingAK(uFile, "EC_WORK_ORDER_REQUEST_ID", "12547");
运行时抛出:
asjava.uniobjects.UniSelectListException: The RPC failed
at asjava.uniobjects.UniSelectList.doAKSelect(UniSelectList.java:568)
at asjava.uniobjects.UniSelectList.selectMatchingAK(UniSelectList.java:511)
at cezinc.unitest.TestUniobject.main(TestUniobject.java:134)
而TCL命令SELECT EC_WORK_ORDER_REQUEST_STATUS WITH EC_WORK_ORDER_REQUEST_ID = 12547能正常返回3条记录,索引信息显示这是一个D-type索引,关联的字段号是1,且索引已启用无待更新项。
可能的问题点及解决方案
1. 索引名称的显示截断问题
从你提供的LIST.INDEX输出里,索引名显示为EC_WORK_ORDER_RE——这大概率是终端输出宽度限制导致的截断,实际完整索引名确实是EC_WORK_ORDER_REQUEST_ID,但也可以尝试用截断后的名称测试一下(虽然可能性低,但值得验证):
uSelect.selectMatchingAK(uFile, "EC_WORK_ORDER_RE", "12547");
2. UniObject for Java对D-type索引的selectMatchingAK支持问题
有些版本的UniObject for Java在处理D-type(基于字典项的)备用索引时,selectMatchingAK方法可能存在兼容性问题。你可以换一种方式,直接通过UniSession执行TCL命令来获取结果,这也是很多开发者绕过此类RPC问题的常用方法:
UniFile uFile = uSession.open("EC_WORK_ORDER_REQUEST_STATUS"); // 执行TCL查询命令 UniCommand queryCmd = uSession.command(); queryCmd.setCommand("SELECT EC_WORK_ORDER_REQUEST_STATUS WITH EC_WORK_ORDER_REQUEST_ID = 12547"); queryCmd.execute(); // 从命令结果中获取选择列表 UniSelectList uSelect = queryCmd.getSelectList(); // 遍历获取记录ID while (uSelect.next()) { String recordId = uSelect.getCurrentId(); // 处理你的记录ID System.out.println("获取到记录ID: " + recordId); }
3. 检查Session连接状态与权限
确保你的uSession是有效且活跃的连接,没有在执行查询前断开,同时当前用户对EC_WORK_ORDER_REQUEST_STATUS文件有足够的读取权限(虽然TCL能执行的话权限应该没问题,但可以再确认)。
4. 尝试升级UniObject for Java版本
如果上面的方法都不行,可能是你使用的UniObject版本存在已知bug,建议升级到最新的兼容版本,很多RPC相关的问题在新版本中都有修复。
总结
优先尝试用执行TCL命令的方式来验证是否能获取到记录,这能快速定位是selectMatchingAK方法的问题还是其他配置问题。如果这种方式可行,就可以暂时用这个方案替代,同时排查索引名称和版本兼容性的问题。
内容的提问来源于stack exchange,提问作者DavRob60

