怎么写RQLQuery?

时间:2018-11-20 09:39:44

标签: atg atg-dynamo

我是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 :(得分:2)

没有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));

这将对数据库执行平均计算(这很擅长),并节省了CPU周期和应用程序中的内存。

也就是说,不要养成使用SqlPassthroughQuery的习惯,因为这意味着您不会使用太多的存储库缓存,这可能会对您的应用程序有害。