【问题标题】:Counting database items with join使用连接计算数据库项目
【发布时间】:2012-06-12 15:45:39
【问题描述】:

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

【问题讨论】:

    标签: sql ormlite


    【解决方案1】:

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

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

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

    salaryQB.selectColumns(salaryQB.EMPLOYEE_ID);
    

    我没有看到salaryQB 的定义位置,但也许其他地方还有更多代码也在使用selectColumns?我试图在QueryBuilderTest unit test 底部重现testInnerCountOf() 方法中的错误,但它似乎工作正常。

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

    编辑:

    从 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());
    

    【讨论】:

    • 抱歉浪费你的时间格雷,我正要删除这个问题。 in 声明是一条红鲱鱼;真正的问题是我不小心给salaryQB.selectColumns(salaryQB.EMPLOYEE_ID); 打了两次电话;一次来自辅助方法。
    • Np 杰夫。该查询很有趣,我很乐意将它添加到我的单元测试集合中。改进异常消息也会对您有所帮助,所以这是一个很好的补充。
    • 我已经调整了我的答案@JeffAxelrod 以使用 4.22 中添加的新 JOIN 功能。
    • 酷,我去看看。谢谢先生。
    • 我已经提交了一个错误请求,并将在未来的版本@Jaa-c 中改进错误消息。感谢您的反馈。
    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2010-09-21
    • 2013-10-01
    • 2021-05-14
    相关资源
    最近更新 更多