java - JPA NamedQuery 不在 Glassfish4 中(但在 Glassfish3 中有效)

标签 java oracle jpa glassfish eclipselink

我正在将使用带有 JPA (EclipseLink) 的 EJB 的应用程序从 Glassfish3 迁移到 Glassfish4。大部分内容都在新服务器上运行,但由于某种原因,在 JPQL 语句中实例化对象的命名查询无法运行:

@NamedQuery(
    name = "countByUserType", 
    query = "SELECT new org.util.CountBean(ev.user.type, count(ev.user.id)) 
             FROM Event ev WHERE ev.idTs = :idTs GROUP BY ev.user.type"
)

我的类 CountBean 是一个简单的 POJO 类

public class CountBean{
    String label;
    Long count;
    public CountBean(String label, Long count) {
        this.label = label;
        this.count = count;
    }
}

我收到的错误消息如下:

 Caused by: Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.QueryException
 Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException].
 Internal Exception: java.lang.NullPointerException
 Query: ReportQuery(name="countByUserType" referenceClass=Event jpql="SELECT new org.util.CountBean(ev.user.type, count(ev.user.idU), 0l) FROM Event ev WHERE ev.idTs = :idTs GROUP BY ev.user.type")
    at org.eclipse.persistence.exceptions.QueryException.prepareFailed(QueryException.java:1584)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:680)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:888)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:613)
    at org.eclipse.persistence.internal.jpa.QueryImpl.getDatabaseQueryInternal(QueryImpl.java:341)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1107)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:522)
    at org.un.sers.repository.EventFacade.countRoomsBooked(EventFacade.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4695)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:630)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
    at sun.reflect.GeneratedMethodAccessor90.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    at sun.reflect.GeneratedMethodAccessor91.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4667)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4655)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    ... 35 more
 Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.queries.ConstructorReportItem.initialize(ConstructorReportItem.java:167)
    at org.eclipse.persistence.queries.ReportQuery.prepare(ReportQuery.java:1058)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:661)
    ... 69 more

我很乐意从经历过类似问题的人那里获得一些见解,或者我发布的代码中是否有一些问题。同样,当我在 Glassfish 3 上部署应用程序时,此方法有效,但在 Glassfish 4 上则无效,并且它连接到的数据库是 Oracle 11g。

最佳答案

这是旧版本 eclipselink 中的错误,检查一下:

<小时/>

解决方案

更好的解决方法是升级到最新版本2.7.1 Latest Release

<小时/>

除了我想使用Payara Server而不是GlassFish 4 Server,修复了许多错误我对这个服务器有很好的体验,它比现在的GlassFish性能更好,速度更快。

关于java - JPA NamedQuery 不在 Glassfish4 中(但在 Glassfish3 中有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50123204/

相关文章:

java - 如何比较哈希表中的值或键?

Java - 根据从串行端口接收的数据动态更改jLabel文本

java - 将 XML 文件转换为 Java LinkedHashSet

JavaFX 检查 Node 属性是否正在被监听

sql - oracle DB - 加入一个凌乱的字符串

sql - "variable = ."(变量 = 点)在 Oracle SQL/SAS 中意味着什么?

当并非所有子类型都有自己的表时,Hibernate、JPA、连接表继承导致循环依赖错误

mysql - 创建 Oracle DBlink 以从 MySql 获取数据

java - 从 JPA 注释生成 DDL

java - JPA加载实体,但在@OneToMany列表中,仅加载特定的