SOQL — запрос списка пользователей, за которыми следит текущий пользователь

В моем приложении я отображаю список текущих пользователей. Прошу так:

Попытка 1

List<User> Following = [SELECT Id, Name, SmallPhotoUrl 
  FROM User 
  WHERE Id IN (
      SELECT ParentId 
      FROM EntitySubscription 
      WHERE SubscriberId = :UserInfo.getUserId()) 
    AND Id != :UserInfo.getUserId() 
  LIMIT 96];

Это делает именно то, что предполагается при входе в систему в качестве администратора, но я обнаружил, что неадминистраторы получают сообщение об ошибке:

Ограничение реализации: EntitySubscription разрешает оценку безопасности для пользователей без прав администратора, только если указано LIMIT и не более 1000.

Хорошо, ничего страшного, я просто добавлю LIMIT вот так:

Попытка 2

List<User> Following = [SELECT Id, Name, SmallPhotoUrl 
  FROM User 
  WHERE Id IN (
      SELECT ParentId 
      FROM EntitySubscription 
      WHERE SubscriberId = :UserInfo.getUserId() 
      LIMIT 1000) 
    AND Id != :UserInfo.getUserId() 
  LIMIT 96];

Легко, верно? НЕПРАВИЛЬНО. Это дает следующее:

ожидал правильных скобок, нашел 'LIMIT'

OK...

Затем я попытался разбить его так:

Попытка 3

List<EntitySubscription> sub = [SELECT ParentId 
  FROM EntitySubscription 
  WHERE SubscriberId = :UserInfo.getUserId() 
  LIMIT 1000];
List<Id> ids = new List<Id>();
for(EntitySubscription s : sub){
    ids.add(s.ParentId);
}
List<User> Following = [SELECT Id, Name, SmallPhotoUrl 
  FROM User 
  WHERE Id IN (:ids) 
    AND Id != :UserInfo.getUserId() 
  LIMIT 96]; 

Я скрестил пальцы и...

Invalid bind expression type of LIST<Id> for column of type Id

Хм, я видел примеры, когда это казалось возможным, например, на доски разработчиков, так что сейчас я немного растерялся.

Итак, мы здесь. Мне нужно выбрать список имен пользователей и изображений, на которые подписан конкретный пользователь в Chatter. Если есть совершенно другой способ сделать это, я открыт для него.


person Ryan Elkins    schedule 06.02.2012    source источник


Ответы (1)


Попробуйте убрать круглые скобки вокруг привязки, т.е. изменить:

WHERE Id IN (:ids) 

to:

WHERE Id IN :ids

А также упростите запрос, просто убедившись, что ваш список идентификаторов не содержит идентификатор текущего пользователя:

List<EntitySubscription> sub = [SELECT ParentId 
  FROM EntitySubscription 
  WHERE SubscriberId = :UserInfo.getUserId() AND ParentId != :UserInfo.getUserId()
  LIMIT 1000];

Set<Id> ids = new Set<Id>();

for(EntitySubscription s : sub){
    ids.add(s.ParentId);
}

Надеюсь, это поможет!

person Matt Lacey    schedule 06.02.2012
comment
Чувак, как только я ответил на твой ответ, я понял, что это сработает - и это сработало. Я приму это, как только смогу (нужно подождать еще несколько минут). Спасибо! - person Ryan Elkins; 07.02.2012
comment
Похоже, это должен быть ответ. Если это так, пожалуйста, отметьте это как ответ. - person tggagne; 03.06.2012