调用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的属性列表查找...
点击下载文档
上一篇:如何通过配置过滤苍穹日志下一篇:【开发平台】GIT全新体验
本文2024-09-23 00:17:53发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-138572.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章