求助:Apex包装类按品牌名称字母序排序返回LWC失败
解决Apex包装类列表按品牌名称字母排序的问题
问题原因
Apex中自定义类的List默认没有内置排序逻辑,直接调用sort()方法不会生效,必须让自定义类实现Comparable接口并明确排序规则。
解决方案
修改ProgramBrandTotalAmount包装类,实现Comparable接口并重写compareTo方法,指定按BrandName的字母顺序排序;最后在返回结果列表前调用sort()方法即可生效。
修改后的完整代码
@AuraEnabled(cacheable=true) public static List<ProgramBrandTotalAmount> ReportWithTotalBrandOrder(String programId) { List<Program_Item__c> programBrandList = [SELECT Brand_Name__c FROM Program_Item__c WHERE Program__c = :programId]; Set<String> uniqueBrandNameSet = new Set<String>(); for (Program_Item__c brandItem : programBrandList) { if (brandItem.Brand_Name__c != null) { uniqueBrandNameSet.add(brandItem.Brand_Name__c); } } List<ProgramBrandTotalAmount> itemstotalAmountListforAllBrandList = new List<ProgramBrandTotalAmount>(); // 补充orderDestinationItemsList的查询逻辑(原代码未体现,需根据业务过滤) List<OrderDestinationItem__c> orderDestinationItemsList = [SELECT Total_Line_Amount__c, OrderDestination__r.ProgramName__c, POS_Item__r.Brand__r.Brand_Name__c FROM OrderDestinationItem__c WHERE OrderDestination__r.Program__c = :programId]; for(String brandName : uniqueBrandNameSet) { ProgramBrandTotalAmount brandTotal = new ProgramBrandTotalAmount(); Decimal totalBrandAmount = 0; for(OrderDestinationItem__c orderItem : orderDestinationItemsList) { if(brandName.equals(orderItem.POS_Item__r.Brand__r.Brand_Name__c)) { totalBrandAmount += orderItem.Total_Line_Amount__c; brandTotal.ProgramName = orderItem.OrderDestination__r.ProgramName__c; brandTotal.BrandName = brandName; brandTotal.ItemTotalAmountForBrand = totalBrandAmount; } } if(brandTotal.BrandName != null) { itemstotalAmountListforAllBrandList.add(brandTotal); } } // 执行排序 itemstotalAmountListforAllBrandList.sort(); return itemstotalAmountListforAllBrandList; } public class ProgramBrandTotalAmount implements Comparable { @AuraEnabled public String BrandName {get;set;} @AuraEnabled public String ProgramName {get;set;} @AuraEnabled public Decimal ItemTotalAmountForBrand {get;set;} // 实现Comparable接口的核心排序逻辑 public Integer compareTo(Object compareTo) { ProgramBrandTotalAmount otherBrand = (ProgramBrandTotalAmount)compareTo; // 按BrandName升序排序(A-Z) return this.BrandName.compareTo(otherBrand.BrandName); } }
关键说明
- 实现Comparable接口:自定义类必须实现
Comparable接口,通过compareTo方法定义两个对象的比较规则——这里利用String.compareTo()方法实现字母顺序的自然排序。 - 调用sort()方法:在组装完结果列表后调用
sort(),此时List会自动按照compareTo中定义的规则排序。 - 额外优化:补充了
orderDestinationItemsList的查询逻辑并添加programId过滤,避免全表扫描;同时在收集品牌名称时增加非空判断,防止空值干扰。
排序规则调整
如果需要按降序(Z-A)排序,只需修改compareTo方法的返回值:
return otherBrand.BrandName.compareTo(this.BrandName);
内容的提问来源于stack exchange,提问作者Kavya
相关产品推荐
相关产品推荐

