我是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查询一样向我返回平均字段值。
答案 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
的习惯,因为这意味着您不会使用太多的存储库缓存,这可能会对您的应用程序有害。