我想在OrmLite中做这样的事情

SELECT *, COUNT(title) as titleCount from table1 group by title;


有什么方法可以通过QueryBuilder做到这一点而无需使用queryRaw?

最佳答案

该文档指出,使用COUNT()等必须使用selectRaw()。我希望找到一种解决方法-不必将SQL编写为字符串是我选择使用ORMLite的主要原因。

http://ormlite.com/docs/query-builder


selectRaw(String ...列):
添加原始列或聚合函数
(COUNT,MAX,...)查询。这会将查询变成
只适合用作原始查询的内容。这可以称为
多次添加更多列以进行选择。请参阅发行原始文件
查询。


我尝试相同的事情时有关使用selectRaw()的更多信息:

文档指出,如果使用selectRaw(),它将“将查询转换为”应由queryRaw()调用的查询。

它没有解释的是,通常多次调用selectColumns()selectRaw()是有效的(如果您仅使用一个或另一个),
selectRaw()之后使用selectColumns()具有“隐藏”的副作用,即消除了先前调用的任何selectColumns()

我相信selectRaw()的ORMLite文档将通过注释说明其用途不与selectColumns()混合而得到改进。

QueryBuilder<EmailMessage, String> qb = emailDao.queryBuilder();
qb.selectColumns("emailAddress"); // This column is not selected due to later use of selectRaw()!
qb.selectRaw("COUNT (emailAddress)");


ORMLite的示例并不如我所愿,因此这里是一个完整的示例,可以正常工作:

QueryBuilder<EmailMessage, String> qb = emailDao.queryBuilder();
qb.selectRaw("emailAddress"); // This can also be done with a single call to selectRaw()
qb.selectRaw("COUNT (emailAddress)");
qb.groupBy("emailAddress");
GenericRawResults<String[]> rawResults = qb.queryRaw(); // Returns results with two columns

07-27 14:04