Java EclipseLink:createNativeQuery验证-org.postgresql.util.PSQLException

Java EclipseLink:createNativeQuery验证-org.postgresql.util.PSQLException,java,postgresql,jpa,jdbc,eclipselink,Java,Postgresql,Jpa,Jdbc,Eclipselink,我遇到了一个奇怪的问题,据我所知,其他人还没有报告过,在使用createNativeQuery时可能有一个bug。我尝试了很多事情来理解为什么没有用 当前环境: EclipseLink 2.7.3 JPA提供商 PostgreSQL 10.6.1数据库 Eclipse光子IDE JRE 1.8.0_121 执行时: Long total = (Long) em.createNativeQuery("Project.count").getSingleResult(); 它抛出了以下内容:

我遇到了一个奇怪的问题,据我所知,其他人还没有报告过,在使用createNativeQuery时可能有一个bug。我尝试了很多事情来理解为什么没有用

当前环境:
  • EclipseLink 2.7.3 JPA提供商
  • PostgreSQL 10.6.1数据库
  • Eclipse光子IDE
  • JRE 1.8.0_121
执行时:

Long total = (Long) em.createNativeQuery("Project.count").getSingleResult();
它抛出了以下内容:

    javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.3.v20180807-4be1041): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: syntax error at or near "Project"
  Position: 1
Error Code: 0
Call: Project.count
Query: DataReadQuery(sql="Project.count")
    at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:391)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:264)
    at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:530)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:404)
    at com.bbandt.util.testers.ProjectTester.ProjectVersionMapping(ProjectTester.java:43)
    at com.bbandt.util.testers.ProjectTester.main(ProjectTester.java:21)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.3.v20180807-4be1041): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: syntax error at or near "Project"
  Position: 1
Error Code: 0
Call: Project.count
Query: DataReadQuery(sql="Project.count")
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:342)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:691)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:567)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2096)
    at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:603)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:275)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:261)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:332)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelect(DatasourceCallQueryMechanism.java:314)
    at org.eclipse.persistence.queries.DataReadQuery.executeNonCursor(DataReadQuery.java:199)
    at org.eclipse.persistence.queries.DataReadQuery.executeDatabaseQuery(DataReadQuery.java:154)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:914)
    at org.eclipse.persistence.queries.DataReadQuery.execute(DataReadQuery.java:139)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:813)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2981)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1895)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1877)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1842)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:262)
    ... 4 more
Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "Project"
  Position: 1
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:106)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1015)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:651)
    ... 21 more
Persistence.xml(故意截断)

这也适用于:

Long total = (Long) em.createNativeQuery("Select count(*) from project").getSingleResult();
我不想因为其他对这个线程不重要的原因而求助于JPQL,我还需要实现SQL结果集映射


对此有任何见解都将不胜感激。我真的没有主意了。

createNamedQuery:用于定义在映射文件或注释中使用同一名称的查询 createNativeQuery:用于执行本机/纯SQL查询


由于将createNativeQuery方法与命名查询一起使用,因此出现上述错误

createNamedQuery:用于在映射文件或注释中定义具有名称的查询createNativeQuery:用于执行本机/纯SQL查询
createNativeQuery(“Project.count”)
将直接执行查询
Project.count
createNativeQuery
不接受命名查询。我理解这两种方法之间的区别……我只是说明,当使用createNamedQuery时,它实际上能够在orm.xml中解析命名查询,而不是createNativeQuery。只是为了证明它可以找到“Product.count”对不起,忘了添加…是的,使用orm.xml映射文件中的命名本机查询name=“Project.count”使用createNamedQuery方法引发了异常。顺便说一句……您也可以在映射文件中指定本机查询……唯一有效的方法是当我使用createNamedQuery时。@user10832358如果您使用createNativeQuery方法,它将不会识别您的命名查询,它只接受本机查询。你有什么问题?我没有。所以,如果你看一下线程的开头,以及我在orm.xml中看到的东西……那是行不通的。参考createNativeQuery()并在映射文件中指定命名查询。如果我使用createNamedQuery()方法,它将起作用(但我不希望使用该方法,因为我需要提供额外的映射)。我发现了一个链接,它实现了我试图实现的东西(但它抛出了前面列出的stacktrace:),我希望我提供的链接解释了在映射文件(例如orm.xml)中可以在何处定义本机查询,而这正是我试图利用的(而不是在代码中使用注释和字符串值)。
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">

    <named-native-query name="Project.count">
        <query>Select count(*) as total from public.project</query>
    </named-native-query>

</entity-mappings>
Long total = (Long) em.createNamedQuery("Project.count").getSingleResult();
Long total = (Long) em.createNativeQuery("Select count(*) from project").getSingleResult();