来自OpenJPA2.2.2的SubqueryImpl中的NPE

时间:2017-10-11 22:39:50

标签: jpa openjpa criteria-api websphere-8

使用Criteria Builder时,有人可以帮助OpenJPA2.2.2的SubqueryImpl类中的NullPointerException吗?该代码适用于WebSphere Liberty上的EclipseLink,但在WebSphere8.5.5上的OpenJPA2.2.2中使用NPE失败。

代码使用CriteriaBuilder构建针对(self)同一个表的子查询,以便拉出具有max(时间戳)的行。

栈跟踪

java.lang.NullPointerException
    at org.apache.openjpa.persistence.criteria.SubqueryImpl.getCandidate(SubqueryImpl.java:319)
    at org.apache.openjpa.persistence.criteria.SubqueryImpl.toValue(SubqueryImpl.java:286)
    at org.apache.openjpa.persistence.criteria.Expressions.toValue(Expressions.java:66)
    at org.apache.openjpa.persistence.criteria.Expressions$Equal.toKernelExpression(Expressions.java:852)
    at org.apache.openjpa.persistence.criteria.PredicateImpl.toKernelExpression(PredicateImpl.java:172)
    at org.apache.openjpa.persistence.criteria.CriteriaExpressionBuilder.evalFilter(CriteriaExpressionBuilder.java:216)
    at org.apache.openjpa.persistence.criteria.CriteriaExpressionBuilder.getQueryExpressions(CriteriaExpressionBuilder.java:75)
    at org.apache.openjpa.persistence.criteria.CriteriaQueryImpl.getQueryExpressions(CriteriaQueryImpl.java:418)
    at org.apache.openjpa.persistence.criteria.CriteriaBuilderImpl.eval(CriteriaBuilderImpl.java:83)
    at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.<init>(ExpressionStoreQuery.java:763)
    at org.apache.openjpa.kernel.ExpressionStoreQuery.newDataStoreExecutor(ExpressionStoreQuery.java:179)
    at org.apache.openjpa.kernel.QueryImpl.createExecutor(QueryImpl.java:749)
    at org.apache.openjpa.kernel.QueryImpl.compileForDataStore(QueryImpl.java:707)
    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:689)
    at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1529)
    at org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:124)
    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:280)
    at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
    at com.ibm.ws.persistence.QueryImpl.getResultList(QueryImpl.java:118)
*   at com.company.pc.connectedcar.api.trip.dao.TripDAO.getTripsByDriverId(TripDAO.java:228)
*   at com.company.pc.connectedcar.api.trip.facade.TripFacade.getTripsForDriver(TripFacade.java:135)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:613)
    at com.ibm.ejs.container.EJSContainer.invokeProceed(EJSContainer.java:5730)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed(InvocationContextImpl.java:568)
    at org.apache.webbeans.ejb.common.interceptor.OpenWebBeansEjbInterceptor.callInterceptorsAndDecorators(OpenWebBeansEjbInterceptor.java:526)
    at org.apache.webbeans.ejb.common.interceptor.OpenWebBeansEjbInterceptor.callToOwbInterceptors(OpenWebBeansEjbInterceptor.java:200)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:613)
    at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:227)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed(InvocationContextImpl.java:548)
    at org.apache.webbeans.ejb.WSEJBInterceptor.callToOwbInterceptors(WSEJBInterceptor.java:136)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:613)
    at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:227)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed(InvocationContextImpl.java:548)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.doAroundInvoke(InvocationContextImpl.java:229)
    at com.ibm.ejs.container.EJSContainer.invoke(EJSContainer.java:5621)
*   at com.company.pc.connectedcar.api.trip.facade.EJSLocalNSLTripFacade_b060b6a6.getTripsForDriver(EJSLocalNSLTripFacade_b060b6a6.java)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:613)
    at org.apache.webbeans.ejb.common.proxy.EjbBeanProxyHandler.invoke(EjbBeanProxyHandler.java:204)
*   at com.company.pc.connectedcar.api.trip.facade.TripFacade_$$_javassist_6.getTripsForDriver(TripFacade_$$_javassist_6.java)
*   at com.company.pc.connectedcar.api.trip.resource.TripResource.getTripsForDriver(TripResource.java:195)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:613)
    at org.apache.wink.server.internal.handlers.InvokeMethodHandler.handleRequest(InvokeMethodHandler.java:63)
    at org.apache.wink.server.handlers.AbstractHandler.handleRequest(AbstractHandler.java:33)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
*   at com.company.inf.ws.rs2.service.handler.COMPANYWinkServiceHandler.handleRequest(COMPANYWinkServiceHandler.java:63)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.handlers.CreateInvocationParametersHandler.handleRequest(CreateInvocationParametersHandler.java:54)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.handlers.AbstractHandler.handleRequest(AbstractHandler.java:34)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleSubResourceMethod(FindResourceMethodHandler.java:188)
    at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:110)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:53)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.handlers.OptionsMethodHandler.handleRequest(OptionsMethodHandler.java:46)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
    at org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:60)
    at org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207)
    at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:154)
    at org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:124)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1227)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:776)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3761)
    at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:976)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:88)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)

DAO

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();

CriteriaQuery<TripEntity> criteriaQuery = criteriaBuilder.createQuery(TripEntity.class);

Root<TripEntity> tripRoot = criteriaQuery.from(TripEntity.class);
criteriaQuery.select(tripRoot);

Path<Timestamp> pathPkTimestamp = tripRoot.<Timestamp> get(COL_TRIP_RECORD_TS);

// Create Predicates for use in the where clause
List<Predicate> predicateList = new LinkedList<Predicate>();

// Predicate DriverId
Predicate predicateDriverId = criteriaBuilder.equal(tripRoot.<String> get(COL_DRIVER_ID), driverId);
predicateList.add(predicateDriverId);

// Subquery to fetch by Max Trip Timestamp
Subquery<Timestamp> sq = criteriaQuery.subquery(Timestamp.class);
Root<TripEntity> tripRoot2 = criteriaQuery.from(TripEntity.class);
Path<Timestamp> pathPkTimestamp2 = tripRoot2.<Timestamp> get(COL_TRIP_RECORD_TS);

sq.select(criteriaBuilder.greatest(pathPkTimestamp2));
sq.where(criteriaBuilder.equal(tripRoot2.get(COL_TRIP_ID), tripRoot.get(COL_TRIP_ID)));

Predicate predicateSubQuery = criteriaBuilder.equal(pathPkTimestamp, sq);
predicateList.add(predicateSubQuery);

// Predicate startDate
if (startDate != null)
{
    Timestamp startTimestamp = new Timestamp(startDate.getTime());
    Predicate predicateStartDate = criteriaBuilder.greaterThanOrEqualTo(pathPkTimestamp, startTimestamp);

    predicateList.add(predicateStartDate);
}

// Predicate endDate
if (endDate != null)
{
    Timestamp endTimestamp = new Timestamp(endDate.getTime());
    Predicate predicateEndDate = criteriaBuilder.lessThanOrEqualTo(pathPkTimestamp, endTimestamp);
    predicateList.add(predicateEndDate);
}

// Set Where clause criteria from Predicate List
Predicate[] predicateArray = new Predicate[predicateList.size()];
criteriaQuery.where(criteriaBuilder.and(predicateList.toArray(predicateArray)));

// Set Order by
criteriaQuery.orderBy(criteriaBuilder.desc(tripRoot.get(COL_TRIP_RECORD_TS)));

实体代码段

@IdClass(TripEntityPK.class)
public class TripEntity implements Serializable
{

private static final long   serialVersionUID    = 1L;

@Id
@Column(name = "OBFUSCATED...._UUID")
private String              tripId;

@Id
@Column(name = "OBFUSCATED....C_TS")
private Timestamp           tripRecordTs;

@Column(name = "OBFUSCATED...._UUID")
private String              driverId;

@Column(name = "OBFUSCATED...._TS")
private Timestamp           driverRecordTs;

...

1 个答案:

答案 0 :(得分:0)

NPE来自于错误地将根到子查询表,因此子查询没有它自己的根。

// incorrect
Root<TripEntity> tripRoot2 = criteriaQuery.from(TripEntity.class);

// corrected code
Root<TripEntity> tripRoot2 = sq.from(TripEntity.class);