我的项目在sql / my_prod.sql下有一个存储过程
我有我的功能delete_entity
在我的实体中
@NamedNativeQuery(name = "delete_entity_prod",
query = "{call /sql/delete_entity(:lineId)}",
我称之为
Query query = entityManager.createNamedQuery("delete_entity_prod")
setParameter("lineId",lineId);
我按照这个例子:http://objectopia.com/2009/06/26/calling-stored-procedures-in-jpa/
但它不执行删除,也不会发送任何错误。
我没有找到关于此的明确信息,我错过了什么吗?也许我需要首先加载my_prod.sql
?但是如何?
答案 0 :(得分:4)
JPA 2.1标准化存储过程支持,如果您能够使用它,并在此处举例http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures
答案 1 :(得分:1)
没有显示错误,因为查询不会在任何时候执行 - 只创建了Query实例。可以通过调用executeUpdate:
来执行查询query.executeUpdate();
然后会出现下一个问题:将一些存储过程写入文件是不够的 - 程序存在于数据库中,而不是文件中。接下来要做的是检查是否有正确的脚本来手动创建存储过程(可能是目前sql / my_prod.sql的内容),然后使用它来通过数据库客户端创建过程。
所有JPA实现都不支持调用存储过程,但我认为Hibernate是在底层使用的,因为它也用于链接教程。
可能是当前的情况
{call /sql/delete_entity(:lineId)}
是在数据库中调用存储过程的正确语法。由于/sql/
,它看起来很可疑。如果事实证明这是不正确的语法,那么:
query
注释中NamedNativeQuery
属性的值。 所有结合MySQL + Hibernate的内容都以here为例进行了解释。
答案 2 :(得分:1)
这实际上是他们创建查询的方式。
Query query = entityManager.createNamedQuery("delete_entity_prod")
setParameter("lineId",lineId);
要调用它,您必须执行:
query.executeUpdate();
当然,DB必须已包含该过程。因此,如果您在SQL文件中定义了它,请查看Executing SQL Statements from a Text File(这适用于MySQL,但其他数据库系统使用类似的方法来执行脚本)