2017-03-31 15 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

あなたが取得するために何を望むかについて、いくつかの有用な例を持って、私はあなたがより多く、したがって

SELECT FROM mydomain.Department WHERE 
    (SELECT AVG(e.salary) FROM mydomain.Employee e WHERE e.department = this) > 10000 

のようなものに等しくなり

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"); 

のようなものを見てお勧めしたいですサブクエリは平均給与を得ますが、外部クエリー部門に加わります。 SQLを定義することで、それがあなたの意図であるかどうかが明らかになりますが、いずれの方法でもサブクエリは単一変数になります

+0

ありがとう。私はyorのコメントを先に見て、私のコードを似たようなものに書き直すことができました。私は私をたくさん助けました。 – Joanna

関連する問題