2013-09-18 1 views
0

Если да, то как?Могу ли я сделать проекционный запрос для свойства, которое является Collection, например java.util.List?

Я установил свойство как тип: List, который во время выполнения является просто списком, который я считаю в любом случае.

Однако при добавлении проекции, я получаю ошибку, что список не поддерживается

query.addProjection (новый PropertyProjection ("ListofLongs", List.class);

java.lang.IllegalArgumentException: Unsupported type: interface java.util.List 
    at com.google.appengine.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:96) 
    at com.google.appengine.api.datastore.RawValue.asType(RawValue.java:58) 

Я также попытался передать класс свойства проецирования как null, чем попытался направить RawValue в List ... no go. (и поддерживается stacktrace по другому методу из-за запуска RawValue.asType исключения)

Is там какой-то недокументированный лимит по проекционным запросам на свойства, которые являются многозначными/коллекциями?

+1

Список - это интерфейс. Разве вы не должны использовать ArrayList.class? – Rudy

+0

Я считаю, что я пробовал это, но я сделаю это снова и отчитаюсь с моими выводами. – Zerkz

+1

java.lang.IllegalArgumentException: неподдерживаемый тип: класс java.util.ArrayList \t в com.google.appengine.repackaged.com.google.common.base.Preconditions.checkArgument (Preconditions.java:94) \t на ком. google.appengine.api.datastore.PropertyProjection. (PropertyProjection.java:36) – Zerkz

ответ

3

GAE Datastore определенно поддерживает projection queries on multi-valued properties.

Но как указано в документах, вы не сможете возвращать свойства в виде всего списка, а только значения списка, соответствующие вашему запросу как отдельные объекты.

Обоснование: запрос проекции - это «поддельный» запрос, который использует только индекс и воссоздает объекты, возвращаемые из данных в индексе. Он никогда не касается фактических Сущностей (в этом весь смысл - быть быстрым). Поскольку каждое значение в многозначном свойстве (collection, array) создает отдельную запись индекса, результат запроса прогноза является отдельным (поддельным) сущностью.

+1

Я вижу, поэтому запрос будет возвращать список вместо списка .getProperty ("propertyThatIsArrayList ")? В основном запрос, который я тестировал, предназначен для захвата ВСЕХ данных, хранящихся в свойстве типа List . Я думал, что могу ускорить это с помощью проекции, потому что мне не нужны другие свойства в Entity. Это возможно? Я понял, что задаю один и тот же вопрос, но мне сложно понять логику/концепцию, введенную в разделе «Обоснование». Не могли бы вы рассказать? Большое спасибо! – Zerkz

+1

Если ваш объект содержит список с тремя свойствами, проекционный запрос не возвращает один объект с этим свойством списка, а три объекта с одним значением. Документы ясно объясняют это. –

+1

Спасибо. Я все еще довольно новичок в модулях «NoSQL» баз данных. Я не слишком уверен, что это приведет к увеличению производительности за счет увеличения количества объектов, не говоря уже о читаемости кода. – Zerkz

Смежные вопросы