我想在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