调用save方法时报错:“从实体类型xxxx的属性列表查找属性失败,属性位置顺序不正确,索引位置:xx,请检查上层程序”

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

调用save方法时报错:“从实体类型xxxx的属性列表查找属性失败,属性位置顺序不正确,索引位置:xx,请检查上层程序”

# 1 问题描述 调用SaveServiceHelper的saveOperate方法或者SaveServiceHelper的save方法时,抛异常:“从实体类型xxxx的属性列表查找属性失败,属性位置顺序不正确,索引位置:xx,请检查上层程序”,或者抛出这个异常:“寻找实体上xxxx对应的属性描述符失败,实体不存在此属性!”。如下图: ![image.webp](/download/0100b43da2f070a144bca4d7234cdf11a568.webp) ![image.webp](/download/010003df1152849642fdb0bb3fd6efac45a4.webp) # 2 原因分析 导致上述异常的其中一个原因,是由于我们在进行批量保存时,会将DynamicObject[]传入save方法,如果DynamicObject[]里面的各个子元素的字段序列不一致,那么在批量保存的时候,实际用的是相同的实体类型去保存,就会导致一种能匹配,一种匹配不上。**以下面的代码为例,因为更新的数据包是查询出来的(只取了部分字段),而新增的数据包拥有全部的字段,这两个数据包的字段不一致,若将这两种数据包放到一起,进行批量保存,就会抛出上述异常。** ``` List<DynamicObject> saveList = new ArrayList<>(); // 查询出来的数据包只有部分字段 DynamicObject[] loadDynamicObjects = BusinessDataServiceHelper.load("kdec_build_materials1", "id,number,name,kdec_count,kdec_count2", new QFilter("kdec_count",QCP.equals, 10).toArray()); for (DynamicObject obj : loadDynamicObjects) { // 更新字段值 obj.set("kdec_count2", 20); } // 将准备要更新数据放到saveList中 saveList.addAll(Arrays.asList(loadDynamicObjects)); // BusinessDataServiceHelper.newDynamicObject创建的对象,有全部的字段 DynamicObject newDynamicObject = BusinessDataServiceHelper.newDynamicObject("kdec_build_materials1"); newDynamicObject.set("number", "test"); newDynamicObject.set("name", "测试"); // 将新增数据放到saveList中 saveList.add(newDynamicObject); // 将saveList转为数组 DynamicObject[] saveDynamicObject = saveList.toArray(new DynamicObject[saveList.size()]); // 保存 OperationResult result = SaveServiceHelper.saveOperate("kdec_build_materials1", saveDynamicObject); ``` **注意**:上述的代码中,我在saveList中,先加入了准备要更新的数据,后加入了新增的数据,会抛出“从实体类型xxxx的属性列表查找属性失败...”的异常。如果将两者调换顺序,在saveList中,先加入了新增的数据,后加入了准备要更新的数据,则会抛出另一个异常:“寻找实体上xxxx对应的属性描述符失败...”。 # 3 解决方案 ## 方案1:将新增的数据包,更新的数据包分开进行保存。 可参考代码如下: ```language // 查询数据 DynamicObject[] loadDynamicObjects = BusinessDataServiceHelper.load("kdec_build_materials1", "id,number,name,kdec_count,kdec_count2", new QFilter("kdec_count",QCP.equals, 10).toArray()); for (DynamicObject obj : loadDynamicObjects) { // 更新字段值 obj.set("kdec_count2", 20); } // 保存更新数据 OperationResult result = SaveServiceHelper.saveOperate("kdec_build_materials1", loadDynamicObjects); // 创建DynamicObject对象 DynamicObject newDynamicObject = BusinessDataServiceHelper.newDynamicObject("kdec_build_materials1"); newDynamicObject.set("number", "test"); newDynamicObject.set("name", "测试"); // 保存新增数据 OperationResult result2 = SaveServiceHelper.saveOperate("kdec_build_materials1", new DynamicObject[]{newDynamicObject}); ``` ## 方案2:更新的数据包查询出全量的字段。 先用QueryServiceHelper查询出id,再用BusinessDataServiceHelper。这样就与新增的数据包保持一致了。 ```language List<DynamicObject> saveList = new ArrayList<>(); // 新增数据 DynamicObject newDynamicObject = BusinessDataServiceHelper.newDynamicObject("kdec_build_materials1"); newDynamicObject.set("number", "test"); newDynamicObject.set("name", "测试"); // 将新增数据放到saveList中 saveList.add(newDynamicObject); // 查询pkid List<Object> list = QueryServiceHelper.queryPrimaryKeys("kdec_build_materials1", new QFilter("kdec_count",QCP.equals, 10).toArray(), null, Integer.MAX_VALUE); // 查询数据 DynamicObject[] loadDynamicObjects = BusinessDataServiceHelper.load(list.toArray(), newDynamicObject.getDynamicObjectType()); for (DynamicObject obj : loadDynamicObjects) { // 更新字段值 obj.set("kdec_count2", 30); } // 将准备要更新数据放到saveList中 saveList.addAll(Arrays.asList(loadDynamicObjects)); // 将saveList转为数组 DynamicObject[] saveDynamicObject = saveList.toArray(new DynamicObject[saveList.size()]); // 保存 OperationResult result = SaveServiceHelper.saveOperate("kdec_build_materials1", saveDynamicObject); ```

调用save方法时报错:“从实体类型xxxx的属性列表查找属性失败,属性位置顺序不正确,索引位置:xx,请检查上层程序”

# 1 问题描述 调用SaveServiceHelper的saveOperate方法或者SaveServiceHelper的save方法时,抛异常:“从实体类型xxxx的属性列表查找...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息