【问题标题】:JPQL update query with Oracle throwing odd error. How can I fix it?JPQL 更新查询与 Oracle 抛出奇怪的错误。我该如何解决?
【发布时间】:2015-06-27 13:02:50
【问题描述】:

我在运行一些 JPQL 查询时遇到了一些问题。在我的域模型中,我有一个 City 类,它有一个名称和对 Country 对象的引用,而 Country 对象也有一个名称。我正在尝试运行此查询:

Query q = em.createQuery("UPDATE City city SET city.name = 'Americaville' WHERE city.country.name = 'America'");
q.executeUpdate();

但是,我得到了这个例外:

 java.sql.SQLSyntaxErrorException: ORA-00971: missing SET keyword

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3665)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1352)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)

这个问题似乎只在我在 where 子句中添加“国家”时出现。也就是说,如果我执行“UPDATE City city SET city.name = 'Americaville' WHERE city.name = 'San Francisco'”,一切运行正常。

我认为 JPQL 可能不允许深度属性遍历,但是查看 JPQL 规范 (http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_bulk_ops),我明白了

single_valued_association_path_expression ::= Identification_variable.{single_valued_association_field.}*single_valued_association_field

这不允许我使用深层路径吗?这似乎是一条允许我编写 entity.property1.other.more.field 的规则。

谢谢!

【问题讨论】:

  • 查询是有效的恕我直言,只是为了实现它,生成的 SQL 可能必须在 FROM 子句中有多个表(大多数 RDBMS 不允许在 UPDATE 语句中这样做)或 JPA 实现也许可以用子查询做点什么?
  • 呸,看起来它确实依赖于 RDBMS:stackoverflow.com/questions/1293330/… 但是 JPA/JPQL 不应该能够重写查询以适应相关 SQL 方言吗?
  • 表“City”的 DDL 是什么? (假设 City 是一个表名)。生成的 SQL 看起来如何?

标签: oracle jpa orm jpql


【解决方案1】:

事实证明,JPQL 不允许在其更新子句中进行连接。解决方法是在 where 子句中使用子查询来选择要更新的正确行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多