java - EclipseLink:createNativeQuery 异常 - org.postgresql.util.PSQLException

标签 java postgresql jpa jdbc eclipselink

我遇到了一个奇怪的问题,据我所知,其他人尚未报告该问题,使用 createNativeQuery 时可能存在错误。我尝试了很多方法来了解为什么没有效果。

当前环境:

  • EclipseLink 2.7.3 JPA 提供程序
  • PostgreSQL 10.6.1 数据库
  • Eclipse Photon 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(故意截断)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="LocalPostgreSQL" transaction-type="RESOURCE_LOCAL">

        <mapping-file>META-INF/orm.xml</mapping-file>
        <mapping-file>META-INF/Queries.xml</mapping-file>
<!--        <mapping-file>META-INF/ResultsetMappings.xml</mapping-file> 
-->

        <class>com.bbandt.jpa.converters.UUIDAttributeConverter</class>
        <class>model.Component</class>
        <class>model.ComponentVulnerability</class>
        <class>model.ComponentVulnerabilityPK</class>
        <class>model.Project</class>
        <class>model.ProjectVersion</class>
        <class>model.ProjectVersionPK</class>

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>

据我所知,指定的 native 查询并未解析回实际的 SQL 内容。

执行此命令有效(并且它解析命名 native 查询名称“Project.count”):

Long total = (Long) em.createNamedQuery("Project.count").getSingleResult();

这也有效:

Long total = (Long) em.createNativeQuery("Select count(*) from project").getSingleResult();

由于其他对该线程不重要的原因,我不想诉诸 JPQL,而且我还需要实现 SQL 结果集映射。

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

最佳答案

createNamedQuery:用于定义映射文件或注释中第 i 个名称的查询 createNativeQuery:用于执行 native /纯 SQL 查询

由于您将 createNativeQuery 方法与命名查询一起使用,因此您会收到上述错误

关于java - EclipseLink:createNativeQuery 异常 - org.postgresql.util.PSQLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53923937/

相关文章:

java - 使用 Java 构建报告

java - 使用 java 和 redis 的 Rate Limiter 无需锁定

mysql - 如何使用 Criteria Query JPA 从数据库表的最后一行开始选择结果?

java - 我可以使用 JPA 通过查询语言更新表的多列吗

java - header 中的 Camel Split list<MyObject>

java - 通过 XPATH 查找没有特定父节点的节点

java - 无法找到具有逻辑名称的列

java - 在 List 属性上使用不带元模型的 JPA2 标准 API

regex - 如何使用 PostgreSQL 从任何 URL 中提取顶级域

json - psql在字符串中插入带有双引号的json