Запрос соединения SOQL возвращает sObject, но не поля. Как использовать полученный ID?

У меня есть SOQL ниже, и я получаю результат, содержащий идентификатор sObject. Мое предположение заключалось в том, что запрос также вернет поля SObject. Например, мой запрос пытается получить «startDay__c» (дата), который похож на поле объекта ShigotoShousai. Но результатом запроса является просто идентификатор экземпляра sObject.

(родительский: ShigotoShousai дочерний: ShigotoAssign)

sObject[] result = [
  SELECT
  ShigotoShousai__r.id, 
  ShigotoShousai__r.startDay__c
  FROM ShigotoAssign__c
];

вывод system.debug(результат)

shigotoAssign_c:{Id=a06500000067aNjAAI, ShigotoShousai_c=a055000000DlHnOAAV}, shigotoAssign_c:{Id=a06500000067aNoAAI, ShigotoShousai_c=a055000000DlHnTAAV}

Я получил ID объекта ShigotoShousai__c sObject вместо его свойства "startDay__c". Я думал, что вывод будет примерно таким:

shigotoAssign__c:{ShigotoShousai__c=a055000000DlHnOAAV, startDay__c=2010-10-10}, 
shigotoAssign__c:{ShigotoShousai__c=a055000000DlHnTAAV, startDay__c=2010-10-13})

Но результат запроса только что вернул мне идентификатор объекта ShigotoShousai__c :(

Теперь я знаю, что у меня есть значение идентификатора ShigotoShousai__c и я хочу получить доступ к его полю, поэтому я сделал следующее.

ShigotoShousai__c foo = (ShigotoShousai__c)result[0].get('ShigotoShousai__c');
//now I assume I can access to some fields like below
system.debug(foo.workDate);

И это дает мне ошибку:

System.TypeException: Invalid conversion from runtime 
type Id to SOBJECT:shigotoShousai__c

Затем я понял, что ID нельзя использовать для ссылки на SObject (например, ShigotoShousai__c).

Но у меня есть его идентификатор. Как я могу получить доступ, скажем, startDay__c? Есть ли способ использовать этот идентификатор?


person Meow    schedule 11.11.2010    source источник


Ответы (2)


Проблема в том, что вы присваиваете результат запроса SOQL универсальному объекту [], который не имеет собственных конкретных полей, кроме идентификатора. Пока вы не пытаетесь сделать что-то необычное с динамическим SOQL, попробуйте что-то вроде этого:

ShigotoAssign__c[] result = [
  SELECT
  ShigotoShousai__r.id, 
  ShigotoShousai__r.startDay__c
  FROM ShigotoAssign__c
];

for(ShigotoAssign__c s : result) {
  System.debug(s.ShigotoShousai__r.startDay__c);
}
person ryanbrainard    schedule 11.11.2010
comment
Большое спасибо за решение!! Я застрял на пару часов! Хорошо, что ребенок может видеть родителей. Я очень скучаю по обычному SQL.. - person Meow; 11.11.2010
comment
Как только вы начнете разбираться в SOQL и его взаимосвязях, он действительно может быть весьма мощным. Я часто переключаюсь между SQL и SOQL, и у каждого из них есть свои преимущества. - person ryanbrainard; 11.11.2010

Также просто хочу поделиться своей информацией, так как она связана с вопросом. Надеюсь, кто-то найдет это полезным.

Ниже запрос включает родителя, ребенка, внука, и я использовал вершину для достижения каждого значения. Теперь я могу отобразить это значение на странице visualforce :)

    //WORK
    public String workName { get; set; }
    public String workContent { get; set; }
    public String workCategory { get; set; }
    public String workSponsor { get; set; }
    //WORK DETAIL
    public String workDetailStartDay { get; set; }
    public String workDetailStartHour { get; set; }
    public String workDetailStartMin { get; set; }
    public String workDetailEndDay { get; set; }
    public String workDetailEndHour { get; set; }
    public String workDetailEndMin { get; set; }
    public String workDetailCategory { get; set; }
    public String workDetailDivision { get; set; }
    //WORK ASSIGN

ShigotoAssign__c[] result = [
            SELECT
            ShigotoShousai__r.Shigoto__r.name,
            ShigotoShousai__r.Shigoto__r.workContent__c,
            ShigotoShousai__r.Shigoto__r.category__c,
            ShigotoShousai__r.Shigoto__r.sponsor__c,
            ShigotoShousai__r.id, ShigotoShousai__r.startDay__c, ShigotoShousai__r.startHour__c,
            ShigotoShousai__r.startMin__c,
            ShigotoShousai__r.endDay__c, ShigotoShousai__r.endHour__c, ShigotoShousai__r.endMin__c,
            ShigotoShousai__r.workCategory__c, ShigotoShousai__r.workDivision__c,
            ShigotoShousai__r.address__c,
            id, contactStat__c
            FROM ShigotoAssign__c
            WHERE id = :workAssigned.id
        ];

    //get WORK info to show on email template page
    workName = result[0].ShigotoShousai__r.Shigoto__r.name;
    workContent = result[0].ShigotoShousai__r.Shigoto__r.workContent__c;
    workSponsor = result[0].ShigotoShousai__r.Shigoto__r.sponsor__c;
    //get WORK DETAIL info to show on email template page
    workDetailStartDay = String.valueOf(result[0].ShigotoShousai__r.startDay__c);
person Meow    schedule 11.11.2010
comment
Вам не нужно превращать все эти значения в переменные, чтобы они отображались на странице Visualforce. Вы можете просто создать одну переменную типа List‹ShigotoAssign__c›, а затем использовать что-то, что перебирает их, например apex:dataTable, и использовать запись через точку на странице. Вот пример: salesforce.com/us/developer/docs/ pages/Content/ Кроме того, если вы добавляете id = в предложение WHERE, вам не нужно делать результат массивом — просто скажите ShigotoAssign__c result = ... - person ryanbrainard; 11.11.2010