【发布时间】: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 parameters。 docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/… -
是的,您的代码不可移植,只能在一个 JPA 实现中使用。
-
一个有效的点。但我相信我们会在未来的 JPA 规范中看到这个特性。在处理非常复杂的查询时,位置参数是一件令人头疼的事情,其中参数出现多次。在那之前,我们没有计划进行另一个 JPA 实施。数据库也是如此。虽然尽可能接近 SQL 标准很重要,但有时您必须使用数据库特定的功能或方言来实现高性能、可维护的查询。编码时总是需要做出决定并在迁移成本和开销之间找到平衡。
标签: java mysql hibernate jpa alias