2013-08-28 18 views
0

我試圖使用單個命名查詢來獲取一組結果並計算可用的數據量。我有一個名爲JPQL查詢:從javax.persistence.Query構建org.eclipse.persistence.queries.ReportQuery

@NamedQuery(name = "query.all.absences.by.name", query = "SELECT a FROM Absence a WHERE a.name = :name") 

當我獲得缺勤,我調用這樣的查詢:

final Query q = em.createNamedQuery("query.all.absences.by.name"); 
q.setParameter("name","aRandomAbsenceName"); 
//maxResults and firstResult are coming as parameters, are computed in another method 
q.setMaxResults(maxResults); 
q.setFirstResult(firstResult); 

q.getResultList()讓我正確的結果集。到現在爲止還挺好。

現在我想要做的是使用相同的命名查詢來執行計數查詢。 我做了以下內容:如果我的命名查詢沒有參數

final Query q = em.createNamedQuery("query.all.absences.by.name"); 
q.setParameter("name","aRandomAbsenceName"); 
q.setHint(QueryHints.QUERY_TYPE, "org.eclipse.persistence.queries.ReportQuery"); 
final ReportQuery test = JpaHelper.getReportQuery(q); 
test.addCount(); 
test.setShouldReturnWithoutReportQueryResult(true); 

這種方法工作得很好。但隨着參數,如果我執行規定的ReportQuery上面我有以下異常:

Exception [EclipseLink-6094] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException 
Exception Description: The parameter name [name] in the query's selection criteria does not match any parameter name defined in the query. 
Query: ReportQuery(referenceClass=AbsenceCategory sql="SELECT COUNT(CATEGORY_KEY) FROM ABSENCE_CATEGORY WHERE (CATEGORY_KEY = ?)") 
    at org.eclipse.persistence.exceptions.QueryException.parameterNameMismatch(QueryException.java:1063) 
    at org.eclipse.persistence.internal.expressions.ParameterExpression.getValue(ParameterExpression.java:275) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.translate(DatabaseCall.java:1000) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:206) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:646) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2611) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2554) 
    at org.eclipse.persistence.queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:846) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:844) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040) 
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:392) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1128) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1516) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1498) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1449) 

還能如何我可能設置的參數爲ReportQuery?

我正在使用EclipseLink 2.0。

回答

3

你如何執行ReportQuery?您需要調用Session.executeQuery(查詢,參數)並傳遞參數列表(與query.getArguments()的順序相同)

您也可以使用JpaEntityManager createQuery(DatabaseQuery)API將ReportQuery 。回到JPA查詢,那麼你可以設置參數的JPA方式

+0

我執行這樣的:。 '最後一次會議會議=((JpaEntityManager)em.getDelegate())的getActiveSession(); 最終載體reportRows =(向量)session.executeQuery(測試); 如果(reportRows!= NULL){ \t回報((小數)reportRows.get(0))的intValue();} ' 所以我應該明確地將查詢參數設置爲ReportQuery,即使我將查詢參數設置爲Query對象? 'JpaHelper.getReportQuery(q);'不會將給定Query對象的參數轉換爲ReportQuery的參數? – madalina