2

Учитывая следующие две таблицы, как я пишу/выполнить следующий запрос в объективизации:Выполнение DISTINCT запроса с объективировать для приложения двигателя

SELECT DISTINCT (AuthorID) из книги Сортировать по дате по убыванию LIMIT 30.

@Entity 
Book{ 
    @Id 
    private Long bookId;//auto generated 
    private Key<Author> authorKey; 
    private String title; 
    private Date date; 
    … 
} 

@Entity 
Author{ 
    @Id 
    private Long authorId;//auto generated 
    private String name; 
    … 
} 

Обратите внимание, что все, что я ищу в моем результате список authorIds, как в

public List<Long> getActiveAuthors(){ 
    ...objectify query goes here 
} 

английская версия может быть немного запутанной, но здесь идет: Я пытаюсь г и 30 авторов, которые недавно опубликовали книги. Предполагается, что каждый автор написал множество книг. А поскольку в каждой книге есть дата публикации, я хочу знать 30 авторов, которые были активны «недавно». Если вы обнаружите, что это объяснение естественного языка отвлекает, просто игнорируйте его: SQL говорит об этом хорошо.

+0

Вы уже создали все необходимые индексы? он уже работает с использованием синтаксиса sql из консоли? –

ответ

2

@stickfigure обычно является экспертом по объективизации, но его ответ немного озадачен. Я был под впечатлением, вы могли бы использовать

List<Book> booksProjection = ofy().load().type(Book.class).project(“authorKey”). 
distinct(true).order("-publicationDate").limit(30).list(); 

Тогда, как только вы получите booksProjection остальное так же просто, как извлечение authorKeys, а затем запросить авторов; так что ваш окончательный ответ будет

public static Collection<Author> getActiveAuthors() { 

    List<Book> result = ofy().load().type(Book.class).project("AuthorKey").distinct(true).order("-publicationDate").limit(30).list(); 
    List<Key<Author>> AuthorKeys = new ArrayList<>(result.size()); 
    for(Book n: result){ 
     AuthorKeys.add(n.getAuthorKey()); 
    } 
    return ofy().load().keys(AuthorKeys).values(); 
    } 
+0

pinging @stickfigure –

+1

2 вещи: 1) пингует его с «@» в вашем комментарии к сообщению, где он не комментировал, но не будет его пинговать. Однако ваш комментарий к его ответу. 2) он говорит, что вы не можете сделать это с одним запросом, который, похоже, об этом спрашивает ОП. Хотя ваш метод работает, он не в одном запросе, поэтому я думаю, что он прав, это не может быть сделано, но ваш способ сделать это - это хороший обходной путь к нему. – Patrice

+0

@Patrice благодарит за ввод, это помогает. И извините за одну вещь запроса. Я на самом деле не имел в виду один запрос, но я полагаю, что мой пост не обладал определенной спецификой. Но спасибо: +1. –

1

Вы не можете сделать это как специальный запрос с хранилищем данных GAE. Обычно рекомендуемым способом решения этой конкретной проблемы является сохранение индексированного свойства lastPlublishDate в объекте Author и его обновление. Затем вы можете ответить на вопрос простым запросом заказа.

Однако, если вы ищете более широкое общее решение для специальных аналитических запросов, лучшим решением, вероятно, является копирование копии данных во внешний индекс (скажем, Cloud SQL) с использованием очереди задач. Затем вы можете задать любой интересующий вас вопрос, независимо от того, насколько интенсивно вычисляться, без риска того, что ваше основное хранилище данных будет загружено.

+0

не ответит ли мой ответ? –

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