我已经尝试修复此问题 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>