0

我在 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一个?但是怎么做?

4

3 回答 3

4

如果您能够使用 JPA 2.1 标准化存储过程支持,则此处提供示例http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures

于 2013-09-26T00:49:15.527 回答
1

没有显示错误,因为查询在任何时候都没有执行 - 只是创建了 Query 的实例。可以通过调用executeUpdate来执行查询:

query.executeUpdate();

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

所有 JPA 实现都不支持调用存储过程,但我假设 Hibernate 是在后台使用的,因为它也在链接教程中使用。

它可以是当前的情况

{call /sql/delete_entity(:lineId)}

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

  1. 请参阅手册以获取正确的语法
  2. 通过客户端测试
  3. 将其用作注释中的query属性值。NamedNativeQuery

例如这里解释了所有与 MySQL+Hibernate 组合的内容。

于 2013-09-25T18:23:58.917 回答
1

这实际上是您创建查询的方式。

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

要调用它,您必须执行:

query.executeUpdate();

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

于 2013-09-26T10:46:11.303 回答