简单更新子句中的datanucleus + postgresql + jpql错误

时间:2013-04-01 10:18:40

标签: jpa datanucleus

我现在已经尝试解决这个问题6个小时了,我不能为我的生活做好准备。

我正在使用:

  • datanucleus 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',其中token ='1234'),但是日志显示datanucleus将查询编译为使用别名的本机查询

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

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

我的问题是:

  • 我该如何克服这个问题?我做错了什么?
  • 一个重要特征的一个非常基本的用例,与Datanucleus失败。这不是第一次这样的事情发生。例如,请参阅此帖子:datanucleus + jpa + oracle. Strange error with tables not existing 我还有其他例子。 这看起来不太好,我不明白为什么,因为我真的找不到其他帖子抱怨这类问题。这个组合(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>

0 个答案:

没有答案