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

1

クエリはどの時点でも実行されないため、エラーは表示されません。クエリのインスタンスのみが作成されます。クエリは、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();

もちろん、DB にはすでにプロシージャが含まれている必要があります。したがって、SQL ファイルで定義している場合は、Executing SQL Statements from a Text File を参照してください(これは MySQL 用ですが、他のデータベース システムでは同様のアプローチを使用してスクリプトを実行します)。

于 2013-09-26T10:46:11.303 に答える