0

使用 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 查询之外,还有什么方法可以做到这一点?

4

1 回答 1

2

人力资源管理系统。我看不出你的代码有任何问题@Jeff。我已经改进了ORMLite中的异常消息以显示未来的实际字段名称,但这对您现在没有帮助:

内部查询必须只指定 1 个选择列而不是 2 个:[id, foreign]

selectColumns(...)该消息 [显然] 试图告诉您您在salaryQBinner中指定了多个QueryBuilder。但是您似乎只在这里选择一列:

salaryQB.selectColumns(salaryQB.EMPLOYEE_ID);

我没有看到在哪里salaryQB定义,但也许在其他地方还有一些代码也在使用selectColumns?我试图在单元测试testInnerCountOf()底部的方法中重现错误,但它似乎工作正常。QueryBuilderTest

如果您可以在单元测试中重现此内容,或者您​​可以看到我的单元测试与您的配置有何不同,请告诉我。

编辑:

从 4.22 版(从 9/2012 开始),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());
于 2012-06-12T16:13:47.500 回答