List has no rows for assignment to SObject error though query returns 行

List has no rows for assignment to SObject error although query returns rows

我对 apex 有点陌生,我正在尝试使用我构建的自定义控制器在 visualforce 页面中显示 selectList。

我在尝试预览 visualforce 页面时收到 "List has no rows for assignment to SObject" 错误,但是 运行 开发者控制台中的查询,returns 行。

这是我的页面:

<apex:page Controller="BpmIcountPayment">
<apex:form >
    <apex:selectList value="{!productsTitle}" multiselect="false">
        <apex:selectOptions value="{!ProductsLov}"></apex:selectOptions>
    </apex:selectList>
</apex:form>
</apex:page>

和我的控制器:

public class BpmIcountPayment{

    private final Account account;

    public String productsTitle {
      get { return 'products for sale'; }
      set;
    }

    public BpmIcountPayment() {
        account = [SELECT Id, Name, Site FROM Account
                   WHERE Id = :ApexPages.currentPage().getParameters().get('id')];
    }

    public Account getAccount() {
        return account;
    }

    public List<SelectOption> getProductsLov() {
        List<SelectOption> products = new List<SelectOption>();
        List<Product2> productsList = [SELECT Id, Name, Family 
                                       FROM Product2 
                                       WHERE (Family = 'ShopProduct') 
                                       OR (Family = 'CourseParent') 
                                       OR (Family = 'SFCourseProgram')];

        for (Product2 currProduct : productsList) {
            products.add(new SelectOption(currProduct.Id, currProduct.Name));
        }

        return products;
    }
}

为了澄清我所指的查询是 getProductsLov() 中的查询。

我的 API 版本是 40,我在沙盒环境中工作。

不可能。如果你得到 "list has no rows to assign to sObject" 这意味着你正在分配给单个对象。这消除了 getProductsLov(除非你没有 post 整个代码)因为你在那里分配给一个列表。

Humo(u)r me 和 System.debug(JSON.serializePretty(ApexPages.currentPage().getParameters())); 在触发该查询之前在你的构造函数中...

您正在查看 URL 中传递的有效帐户 ID 的页面?该帐户对您当前的用户可见吗?如果该页面是特定于帐户的,请尝试使用 <apex:page standardController="Account" extensions="BpmIcountPayment">...(您必须先在 apex 中提供不同的构造函数)。这可以大大简化您的代码。

public BpmIcountPayment(ApexPages.StandardController sc){
    if(String.isBlank(sc.getId()){
        System.debug('you screwed up passing the valid acc id');
    } else {
        acc = (Account) sc.getRecord();
    }
}