JPA:如何调用存储过程

时间:2013-09-25 16:10:38

标签: jpa stored-procedures

我的项目在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?但是如何?

3 个答案:

答案 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/,它看起来很可疑。如果事实证明这是不正确的语法,那么:

  1. 请参阅手册以获取正确的语法
  2. 通过客户端测试
  3. 将其用作query注释中NamedNativeQuery属性的值。
  4. 所有结合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,但其他数据库系统使用类似的方法来执行脚本)