You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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);
    }
}

关键说明

  1. 实现Comparable接口:自定义类必须实现Comparable接口,通过compareTo方法定义两个对象的比较规则——这里利用String.compareTo()方法实现字母顺序的自然排序。
  2. 调用sort()方法:在组装完结果列表后调用sort(),此时List会自动按照compareTo中定义的规则排序。
  3. 额外优化:补充了orderDestinationItemsList的查询逻辑并添加programId过滤,避免全表扫描;同时在收集品牌名称时增加非空判断,防止空值干扰。

排序规则调整

如果需要按降序(Z-A)排序,只需修改compareTo方法的返回值:

return otherBrand.BrandName.compareTo(this.BrandName);

内容的提问来源于stack exchange,提问作者Kavya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:55:26