2017-10-11 166 views
0

使用Criteria Builder時,任何人都可以幫助OpenJPA2.2.2的SubqueryImpl類中的NullPointerException?該代碼與WebSphere Liberty上的EclipseLink協同工作,但在WebSphere8.5.5上的OpenJPA2.2.2中與NPE一起失敗。來自OpenJPA2.2.2的SubqueryImpl中的NPE

該代碼使用CriteriaBuilder爲(自)同一個表構建子查詢,以便使用max(timestamp)拉行。


堆棧跟蹤

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

Ë ntity片斷

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

... 

+0

最好多發一點例外情況。發佈至少3-4個級別的例外,而不僅僅是最後一個。 –

+0

我添加了一個更長的堆棧跟蹤,它顯示來自傳入的REST請求的堆棧,由WebSphere提供服務,並向下遍歷到DAO層到JPA調用。 – mvarvil

回答

0

的NPE來自得到根本上的子查詢表不正確,使得子查詢沒有它自己的根。

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

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