【问题标题】:Why is this alias in JPA named native query not working?为什么 JPA 中名为本机查询的此别名不起作用?
【发布时间】:2014-06-05 11:51:31
【问题描述】:

这个不行:

<named-native-query name="FileSet.deleteByMemberId">
    <query>DELETE FROM FileSet f WHERE f.file_id = :fileId</query>
</named-native-query>

它给出了这个错误:

ERROR: You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near
'f WHERE f.file_id = 692' at line 1

虽然此语句完美运行(没有表别名):

<named-native-query name="FileSet.deleteByMemberId">
    <query>DELETE FROM FileSet WHERE file_id = :fileId</query>
</named-native-query>

为什么?我使用 MySQL 和 Hibernate 作为 JPA 提供程序。

【问题讨论】:

  • 您指定了 JPQL 却作为 SQL 执行。 SQL 没有 ":param" 语法。参数是“?”在 JDBC 中
  • 这可能是 Hibernate 特有的,但 Hibernate 支持原生 SQL 中的命名参数:Native SQL queries support positional as well as named parametersdocs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/…
  • 是的,您的代码不可移植,只能在一个 JPA 实现中使用。
  • 一个有效的点。但我相信我们会在未来的 JPA 规范中看到这个特性。在处理非常复杂的查询时,位置参数是一件令人头疼的事情,其中​​参数出现多次。在那之前,我们没有计划进行另一个 JPA 实施。数据库也是如此。虽然尽可能接近 SQL 标准很重要,但有时您必须使用数据库特定的功能或方言来实现高性能、可维护的查询。编码时总是需要做出决定并在迁移成本和开销之间找到平衡。

标签: java mysql hibernate jpa alias


【解决方案1】:

参见MySQL DELETE - DELETE 中没有别名的语法定义。

【讨论】:

  • 虽然这并不完全正确,但它帮助我找到了答案,所以我会投票赞成。
【解决方案2】:

显然,这个查询有效:

<named-native-query name="FileSet.deleteByMemberId">
    <query>DELETE f FROM FileSet f WHERE f.file_id = :fileId</query>
</named-native-query>

MySQL docs 只在页面底部提到这一点:

如果为表声明别名,则在引用表时必须使用别名:DELETE t1 FROM test AS t1, test2 WHERE ...

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 2012-03-26
    • 2016-12-16
    • 2012-08-25
    • 2017-04-30
    • 2021-09-25
    • 2021-06-26
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多