Spring data jpa呼び出しストレージプロシージャ

6590 ワード

ネット上のこの方面の例は多くなくて、研究して、いくつかの呼び出しの方法をリストしました.
mysqlのストレージ・プロシージャがあれば
CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT)
BEGIN 
    SET res = ARG + 1;
END

intパラメータを入力、このパラメータ+1を返す.
このストレージ・プロシージャを呼び出すならそうすることができます.
 
寸法entity
package com.labofjet.entity;

import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;

@Entity
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }),
        @NamedStoredProcedureQuery(name = "User.mytest", procedureName = "mytest") })
public class A {
    @EmbeddedId
    APK id;

    String age;

    @Embedded
    AComponent acomponent;

    public AComponent getAcomponent() {
        return acomponent;
    }

    public void setAcomponent(AComponent acomponent) {
        this.acomponent = acomponent;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public APK getId() {
        return id;
    }

    public void setId(APK id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        System.out.println("Ahash");
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        System.out.println("Aequals");
        return super.equals(obj);
    }
}

1つのentityを探してもいいです.複数のストレージ・プロシージャがあれば、@NamedStoredProcedureQueriesを使って私の上のようにすることができます.ストレージ・プロシージャが1つしかない場合は、@NamedStoredProcedureQueryの代わりに@NamedStoredProcedureQueriesを使用できます.
@StoredProcedureParameterは、ストアド・プロシージャのパラメータを表示するために使用されます.特に何もありません.ただし、nameはデータベースのパラメータ名と同じであることに注意してください.
@Name StoredProcedureQueryのprocedureNameもデータベースに格納されているプロシージャの名前と同じです.名前は自分で値を取ることができ、データベースとは関係ありません.
 
repositoryの寸法方法
package com.labofjet.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.labofjet.entity.A;
import com.labofjet.entity.APK;

@Repository
public interface ARepository extends JpaRepository<A, APK>{
    
    @Procedure
    Integer plus1inout(Integer arg);
    
    @Procedure(name="plus1")
    Integer alias1(Integer arg);
    
    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);
    
    @Procedure(name="User.plus1")
    Integer alias3(@Param("arg")Integer argAlias);
    
    @Procedure
    Object[] mytest();
}

entity A対応のrepositoryには、そのストレージ・プロシージャを見つける方法がいくつかあります.
    @Procedure
    Integer plus1inout(Integer arg);
    
    @Procedure(name="plus1") Integer alias1(Integer arg); @Procedure(procedureName="plus1inout") Integer alias2(Integer arg); @Procedure(name="User.plus1") Integer alias3(@Param("arg")Integer argAlias);


上記の4つの方法のうち、
Integer alias1(Integer arg);


この方法はだめです.他の3つの方法はすべてできます.実はalias 1でもいいと思います...バグかどうかはわかりませんが....
    @Procedure
    Integer plus1inout(Integer arg);


以上の方法では、メソッド名はストレージプロシージャ名と同じである.
    @Procedure(name="plus1")
    Integer alias1(Integer arg);

alias 1という方法を使うと間違えます.alias 3に変更する方法が考えられる.メソッドのパラメータに@Param注記を追加すると、エラーは報告されません.(バグだと思います)
    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);

上記の方法ではprocedureをデータベースに格納プロセスの名前に設定する必要があるが、利点はalias 3と同様に、メソッド名は勝手に自分で取ることであり、plus 1 inoutメソッド名より固定するしかなく、より柔軟である.
 
以上の3つの実行可能な方法の中で1つ目が最も簡単だと感じます..注釈のプロパティは何も書かなくてもいいです.唯一要求されるのは、メソッドの名前がストレージプロセスの名前と同じであることである.
 
その他
spring data jpa呼び出しストレージプロセスは比較的簡単な感じがする.しかし、ストレージ・プロシージャが結果セットを返すとうまく処理できないようです.(いろいろ参考になりましたが.良い解决方法はありません..后で新しい発见があってから更新します)