Как написать RQLQuery? - PullRequest
       63

Как написать RQLQuery?

0 голосов
/ 20 ноября 2018

Я новичок в ATG, и у меня есть этот вопрос.Как я могу написать свой RQLQuery, который предоставляет мне данные, такие как этот SQL-запрос?

select avg(rating) from rating WHERE album_id = ?;

Я пытаюсь так:

RqlStatement statement;
    Object rqlparam[] = new Object[1];
    rqlparam[0] = album_Id;
    statement= RqlStatement.parseRqlStatement("album_id= ? 0");
    MutableRepository repository = (MutableRepository) getrMember();
    RepositoryView albumView = repository.getView(ALBUM);

Этот запрос возвращает мне элемент дляконкретный album_id, как я могу улучшить свой RQL-запрос, чтобы он возвращал мне среднее значение поля, как SQL-запрос выше.

1 Ответ

0 голосов
/ 21 ноября 2018

Нет синтаксиса RQL, который позволял бы вычислять среднее значение для элементов в запросе.Таким образом, у вас есть два варианта.Вы можете выполнить свой текущий оператор:

album_id= ? 0

, а затем выполнить цикл по полученному RepositoryItem[] и самостоятельно рассчитать среднее значение (это может занять много времени на больших наборах данных и означает, что вам придется загрузить всерезультаты в память, так что, возможно, не лучшее решение) или вы можете реализовать SqlPassthroughQuery, который вы выполняете.

Object params[] = new Object[1];
params[0] = albumId;

Builder builder = (Builder)view.getQueryBuilder();
String str = "select avg(rating) from rating WHERE album_id = 1 group by album_id";

RepositoryItem[] items =
    view.executeQuery (builder.createSqlPassthroughQuery(str, params));

Это выполнит вычисление среднего значения в базе данных (что-то, что это довольно хорошо делает)и экономит ваши циклы ЦП и память в приложении.

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

...