JDOQL子查询 - 无法解析类名_

时间:2017-03-31 20:58:29

标签: java jdo datanucleus jdoql

我是JDOQL的新手,我在下面遇到了麻烦。我试图获得部门的平均工资,然后选择平均工资高于某个值的部门。

Query averageSalaryByDep = pm.newQuery(Employee.class);
averageSalaryByDep.setResult("department, avg(salary)");
averageSalaryByDep.setGrouping("department");

Query qry = pm.newQuery(Department.class);
qry.setFilter("this.name == dep.name && averageSalary > 10000");
qry.declareVariables("Department dep, double averageSalary");
qry.addSubquery(averageSalaryByDep, "Department dep, double averageSalary", null);

我目前收到的错误消息:

javax.jdo.JDOUserException: Class name averageSalary could not be resolved
    at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:636)
    at org.datanucleus.api.jdo.JDOQuery.executeInternal(JDOQuery.java:391)
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:216)

1 个答案:

答案 0 :(得分:1)

子查询具有单个变量名称(并返回单个事物)。如果对某些内容不确定,请将单字符串查询看起来像(以及生成的SQL),然后应该清楚。 JDO规范有一些有用的例子IIRC

关于您想要检索的内容,我建议您查看更像

的内容
Query averageSalarySubq = pm.newQuery(Employee.class);
averageSalarySubq.setResult("avg(salary)");
averageSalarySubq.setFilter("this.department = :outerDepartment");

Query qry = pm.newQuery(Department.class);
qry.setFilter("averageSalary > 10000");
qry.declareVariables("double averageSalary");
qry.addSubquery(averageSalarySubq, "double averageSalary", null, "this");

等同于

之类的东西
SELECT FROM mydomain.Department WHERE 
    (SELECT AVG(e.salary) FROM mydomain.Employee e WHERE e.department = this) > 10000

因此子查询获得平均工资但加入了外部查询部门。定义SQL会向您显示这是否是您想要的,但子查询是否适用于单个变量