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"
ХОРОШО...
Затем я попытался разбить его так:
Попытка 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 ответ
Попробуйте удалить круглые скобки вокруг привязки, т.е. измените:
WHERE Id IN (:ids)
чтобы:
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);
}
Надеюсь, это поможет!