Apex Salesforce中读取sObjects类型Map的值求助
读取Map中Value集合值的几种方法
你的代码已经正确构建了以CreatedById为键、对应用户订单列表为值的Map,以下是几种读取Value中记录的实用方式:
1. 遍历Map所有键,逐个获取对应订单列表
通过keySet()拿到所有用户Id,再用get()方法获取该用户的订单列表,之后遍历每条记录读取字段:
// 遍历Map的所有用户Id键 for (Id userId : usersOrdersMap.keySet()) { // 获取当前用户对应的订单列表 List<OrderDestinationItem__c> userOrders = usersOrdersMap.get(userId); System.debug('用户Id:' + userId + ' 的订单数量:' + userOrders.size()); // 遍历该用户的每一条订单记录 for (OrderDestinationItem__c orderItem : userOrders) { // 读取订单字段示例 System.debug('订单Id:' + orderItem.Id); System.debug('订单状态:' + orderItem.OrdStatus__c); System.debug('订单金额:' + orderItem.Total_Line_Amount__c); // 其他字段可按同样方式读取 } }
2. 直接遍历Map的键值对条目
使用entrySet()直接获取Map的键值对,无需单独通过键取值,写法更简洁:
// 遍历Map的每个键值对条目 for (Map.Entry<Id, List<OrderDestinationItem__c>> entry : usersOrdersMap.entrySet()) { Id userId = entry.getKey(); // 获取当前条目对应的用户Id List<OrderDestinationItem__c> userOrders = entry.getValue(); // 获取当前条目对应的订单列表 System.debug('用户Id:' + userId + ' 的订单详情:'); for (OrderDestinationItem__c orderItem : userOrders) { System.debug('创建时间:' + orderItem.CreatedDate + ',订单金额:' + orderItem.Total_Line_Amount__c); } }
3. 根据特定用户Id直接读取订单
如果已知目标用户Id,可直接通过键获取对应订单列表,再遍历读取:
// 替换为实际目标用户Id Id targetUserId = '005XXXXXXXXXXXX'; if (usersOrdersMap.containsKey(targetUserId)) { List<OrderDestinationItem__c> targetOrders = usersOrdersMap.get(targetUserId); for (OrderDestinationItem__c orderItem : targetOrders) { System.debug('目标用户订单Id:' + orderItem.Id + ',状态:' + orderItem.OrdStatus__c); } } else { System.debug('该用户无符合条件的订单'); }
额外优化:简化Map构建写法
你当前的Map构建逻辑没问题,也可以用SOQL分组配合构造器简化(效率相近,写法更短):
Map<Id, List<OrderDestinationItem__c>> usersOrdersMap = new Map<Id, List<OrderDestinationItem__c>>(); // 先按用户分组,再批量查询每个用户的订单 for (AggregateResult ar : [SELECT CreatedById FROM OrderDestinationItem__c WHERE CreatedDate > 2024-04-10T07:27:52.000+0000 AND Total_Line_Amount__c > 20 GROUP BY CreatedById]) { Id userId = (Id)ar.get('CreatedById'); usersOrdersMap.put(userId, [SELECT Id, CreatedDate, OrdStatus__c, Total_Line_Amount__c FROM OrderDestinationItem__c WHERE CreatedById = :userId AND CreatedDate > 2024-04-10T07:27:52.000+0000 AND Total_Line_Amount__c > 20]); }
内容的提问来源于stack exchange,提问作者SeekerOfKnowledge
相关产品推荐
相关产品推荐

