使用ORMLite,我想计算符合特定条件的数据库项目数。我的数据库的简化版本如下:
Employee Table:
employeeId
departmentId
Department Table:
departmentId
Salary Table:
employeeId
payGrade
假设我想计算处于特定薪资等级的部门中的员工数量。当我尝试类似下面的内容时,我收到一个异常报告,只允许一个选择列。
salaryQB.selectColumns(salaryQB.EMPLOYEE_ID);
salaryQB.where().eq(salaryQB.PAY_GRADE, 12);
employeeQB.where.in(Employee.DEPARTMENT_ID, departmentList)
.and().in(employeeQB.EMPLOYEE_ID, salaryQB);
employeeQB.setCountOf(true);
count = dao.countOf(employeeQB.prepare());
但是像这样的代码会返回以下错误:
RuntimeException(java.sql.SQLException:内部查询必须只有1 选择指定的列而不是2)
有没有办法在编写原始SQL查询时做到这一点?
答案 0 :(得分:2)
槽糕。我看不到您的代码@Jeff的任何问题。我已经改进了ORMLite中的异常消息,以显示未来的实际字段名称,但这对您现在没有帮助:
内部查询必须只指定1个选择列而不是2:[id,foreign]
该信息[显然]试图告诉您,您已在selectColumns(...)
内部salaryQB
中指定了多个QueryBuilder
。但你似乎只在这里选择一列:
salaryQB.selectColumns(salaryQB.EMPLOYEE_ID);
我看不到定义salaryQB
的位置,但是在其他地方还有更多代码也在使用selectColumns
?我试图将testInnerCountOf()
方法中的错误重现在QueryBuilderTest
unit test的底部,但似乎工作正常。
如果您可以在单元测试中重现这一点,或者如果您可以看到我的单元测试与您的配置有何不同,那么请告诉我。
修改强>
从版本4.22(从2012年9月开始),ORMLite现在支持简单的JOIN语句。因此,您的查询可以简化为:
salaryQB.where().eq(salaryQB.PAY_GRADE, 12);
employeeQB.join(salaryQB);
employeeQB.where().in(Employee.DEPARTMENT_ID, departmentList);
employeeQB.setCountOf(true);
count = dao.countOf(employeeQB.prepare());