使用join计算数据库项

时间:2012-06-12 15:45:40

标签: sql ormlite

使用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查询时做到这一点?

1 个答案:

答案 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());