SOQL - запрос списка пользователей, за которым следует текущий пользователь - PullRequest
2 голосов
/ 07 февраля 2012

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

Попытка 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

Ладно, ничего страшного, я просто добавлю ПРЕДЕЛ там, вот так:

Попытка 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

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

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

1 Ответ

7 голосов
/ 07 февраля 2012

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

WHERE Id IN (:ids) 

на:

WHERE Id IN :ids

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

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);
}

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

...