ormlite按类型选择count(*)作为typeCount组

时间:2014-04-15 13:14:48

标签: ormlite

我想在OrmLite

中做这样的事情
SELECT *, COUNT(title) as titleCount from table1 group by title;

有没有办法通过QueryBuilder这样做而不需要queryRaw?

2 个答案:

答案 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中以更好的方式实现这一目标。我会调查一下。