简体   繁体   English

从javax.persistence.Query构建org.eclipse.persistence.queries.ReportQuery

[英]build a org.eclipse.persistence.queries.ReportQuery from a javax.persistence.Query

I am trying to use a single named query both for obtaining a set of results and to count the available amount of data. 我正在尝试使用单个命名查询来获取一组结果并计算可用数据量。 I have a named JPQL query: 我有一个命名的JPQL查询:

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

When I obtain the Absences I'm invoking the query like this: 当我获得缺勤时,我将像这样调用查询:

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() gets me the correct result set. q.getResultList()我提供了正确的结果集。 So far so good. 到现在为止还挺好。

Now what I want to do is use the same named query to execute a count query. 现在,我要做的是使用相同的命名查询来执行计数查询。 I'm doing the following: 我正在执行以下操作:

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

This approach works fine if my named query does not have parameters. 如果我的命名查询没有参数,则此方法效果很好。 But with parameters, if I execute the ReportQuery defined above I have the following exception: 但是使用参数时,如果执行上面定义的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)

How else can I possibly set the parameters to a ReportQuery? 我还能如何将参数设置为ReportQuery?

I'm using EclipseLink 2.0. 我正在使用EclipseLink 2.0。

How are you executing the ReportQuery? 您如何执行ReportQuery? You need to call Session.executeQuery(query, arguments) and pass a List of the arguments (order the same as query.getArguments(). 您需要调用Session.executeQuery(query,arguments)并传递参数列表(顺序与query.getArguments()相同)。

You can probably also use the JpaEntityManager createQuery(DatabaseQuery) API to convert the ReportQuery back to a JPA Query, then you can just set the parameter the JPA way. 您可能还可以使用JpaEntityManager createQuery(DatabaseQuery)API将ReportQuery转换回JPA查询,然后可以通过JPA方式设置参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 具有泛型的javax.persistence.Query - javax.persistence.Query with Generics 如何从 javax.persistence.Query 获取查询字符串? - how to get query string from a javax.persistence.Query? javax.persistence.Query没有设置参数 - javax.persistence.Query does not set parameter 如何模拟和单元测试 javax.persistence.EntityManager 和 javax.persistence.Query? 获取空指针异常 - How to mock and unit test javax.persistence.EntityManager and javax.persistence.Query? Getting NullPointerException hibernate错误:java.lang.ClassCastException:org.hibernate.impl.QueryImpl无法转换为javax.persistence.Query - hibernate Error : java.lang.ClassCastException: org.hibernate.impl.QueryImpl cannot be cast to javax.persistence.Query Spring + javax.persistence.Query:管理从H2和PosgreSQL DB本机日期类型到OffsetDateTime的类型转换 - Spring + javax.persistence.Query: Manage type conversion from H2 and PosgreSQL DB native date types to OffsetDateTime org.eclipse.persistence.indirection.IndirectMap 无法使用 EclipseLink 转换为 org.eclipse.persistence.queries.FetchGroupTracker - org.eclipse.persistence.indirection.IndirectMap cannot be cast to org.eclipse.persistence.queries.FetchGroupTracker using EclipseLink Eclipse警告:找不到类javax.persistence。* - Eclipse Warnings: class javax.persistence.* not found javax.persistence.PersistenceException-无法构建EntityManagerFactory - javax.persistence.PersistenceException - Unable to build EntityManagerFactory org.jboss.resteasy.spi.UnhandledException:javax.persistence.PersistenceException:无法建立实体管理器工厂 - org.jboss.resteasy.spi.UnhandledException: javax.persistence.PersistenceException: Unable to build entity manager factory
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM