我想在OrmLite
中做这样的事情SELECT *, COUNT(title) as titleCount from table1 group by title;
有没有办法通过QueryBuilder这样做而不需要queryRaw?
答案 0 :(得分:1)
文档指出使用COUNT()等需要使用selectRaw()
。我希望能解决这个问题 - 不必将我的SQL写成字符串是我选择使用ORMLite的主要原因。
http://ormlite.com/docs/query-builder
selectRaw(String ... columns):
添加原始列或聚合函数 (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
答案 1 :(得分:0)
有没有办法通过
QueryBuilder
执行此操作而无需queryRaw(...)
?
简短的回答是否定的,因为ORMLite不知道如何处理额外的计数值。如果您有一个带有DAO定义的Table1
实体,那么COUNT(title)
会进入哪个字段?原始查询使您能够选择各种字段,但是您需要处理结果。
现在使用代码(v5.1),您可以定义custom RawRowMapper
,然后使用dao.getRawRowMapper()
method来处理Table1
的结果并添加titleCount
手工制作。
我已经知道如何在ORMLite中以更好的方式实现这一目标。我会调查一下。