2013-09-25 69 views
0

我有一个存储过程在我的项目下的SQL/my_prod.sqlJPA:如何调用存储过程

有我有我的功能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

[从Java/JPA调用存储过程](http ://stackoverflow.com/questions/3572626/calling-stored-procedure-from-java-jpa) – Vadzim

回答

1

使用它,用实例这实际上是他们的方式创建查询。

Query query = entityManager.createNamedQuery("delete_entity_prod") 
      setParameter("lineId",lineId); 

要调用它,你必须执行:

query.executeUpdate(); 

当然,DB必须已包含的程序。因此,如果你已经在你的SQL文件中定义了它,看看Executing SQL Statements from a Text File(这是用于MySQL,但其他数据库系统使用类似的方法来执行脚本)

1

没有显示错误,因为在任何时候查询都没有执行 - 只是创建了Query实例。查询可致电executeUpdate执行:

query.executeUpdate(); 

然后会出现下一个问题:编写一些存储过程的文件是不够的 - 程序住在数据库中,而不是在文件中。所以接下来要做的是检查是否有正确的脚本来创建手中的存储过程(也许这是当前sql/my_prod.sql的内容),然后使用它通过数据库客户端创建过程。

所有JPA实现都不支持调用存储过程,但我认为Hibernate在底层使用,因为它也在链接教程中使用。

它可以是当前

{call /sql/delete_entity(:lineId)} 

是调用数据库中的存储过程语法正确的情况下。它看起来相当可疑,因为/sql/。如果事实证明,这是不正确的语法,然后:

  1. 通过客户端的语法是否正确
  2. 测试咨询手册
  3. 使用作为NamedNativeQuery注释的query属性的值。

所有与组合MySQL +休眠相关的例子都是以here为例。