2017-03-31 102 views
0

我是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

子查询有一个变量名(并返回一个单一的东西)。如果对某些事情不确定,请将单字符串查询看起来像(以及生成的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会告诉你这是否是你想要的,但无论哪种方式子查询是单个变量

+0

谢谢。我之前看到过你的评论,并能够将我的代码改写成类似的东西。我帮了我很多。 – Joanna