0

我已经尝试修复此问题 6 小时,但我终其一生都无法弄清楚。

我在用着 :

  • 数据核 3.2.1,带有 JPA
  • x86_64-unknown-linux-gnu 上的 PostgreSQL 8.4.4,由 GCC gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-10) 编译,64 位
  • postgres jdbc 驱动程序版本:9.1-901.jdbc4

我正在尝试通过 jpql 执行一个非常简单的更新查询。查询基本上是:

UPDATE MyClass x SET x.recordStatus='0' where x.token='1234'

我的代码如下所示:

    String updateClause = "UPDATE MyClass x SET x.recordStatus='0' where x.token='1234'";
    EntityManager entityManager = getDefaultEntityManager();
    Query query = entityManager.createQuery(updateClause);
    query.executeUpdate();
    entityManager.close();

我遇到的问题是驱动程序抛出错误

Caused by: org.postgresql.util.PSQLException: ERROR: column "a0" of relation "my_class" does not exist
                                Position: 42
                                    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
                                    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)

这是正常的,因为 postgres 接受以下形式的更新:

update some_table x set field=value where field2=another_value

...但不是

update some_table x set x.field=value where x.field2=another_value

(即执行更新时在 SET 或 WHERE 子句中没有别名)

我试过写我的 jpql 查询:

  • 不在 SET 和 WHERE 子句中使用别名(更新 MyClass x set recordStatus='0' where token='1234'),但日志显示 datanucleus 将查询编译为无论如何都使用别名的本机查询。

  • 根本不使用别名(甚至不使用类名),但在这种情况下,datanucleus 会抛出一个错误,我必须有一个别名。

有关依赖项的完整列表,请参阅本文末尾。

我的问题是:

  • 我怎样才能克服这个问题?我究竟做错了什么 ?
  • 一个重要特性的非常基本的用例在 Datanucleus 上失败了。这不是第一次发生这样的事情。例如看到这篇文章:datanucleus + jpa + oracle。表不存在的奇怪错误 我还有其他示例。这看起来不太好,我不明白为什么,因为我真的找不到其他抱怨这类问题的帖子。这种组合(datanucleus + postgres)真的没用过吗?它几乎看起来被遗弃了。

感谢您的时间。亲切的问候,安德烈

我的依赖项列表:

    <dependency>
        <groupId>org.apache.geronimo.specs</groupId>
        <artifactId>geronimo-jpa_2.0_spec</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901.jdbc4</version>
    </dependency>

    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-core</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-rdbms</artifactId>
        <version>3.2.0-release</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-api-jpa</artifactId>
        <version>3.2.0-release</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-connectionpool</artifactId>
        <version>2.0.3</version>
    </dependency>
    <dependency>
        <groupId>javax.jdo</groupId>
        <artifactId>jdo2-api</artifactId>
        <version>2.2</version>
    </dependency>
4

0 回答 0