Spring data jpa呼び出しストレージプロシージャ
6590 ワード
ネット上のこの方面の例は多くなくて、研究して、いくつかの呼び出しの方法をリストしました.
mysqlのストレージ・プロシージャがあれば
intパラメータを入力、このパラメータ+1を返す.
このストレージ・プロシージャを呼び出すならそうすることができます.
寸法entity
1つのentityを探してもいいです.複数のストレージ・プロシージャがあれば、@NamedStoredProcedureQueriesを使って私の上のようにすることができます.ストレージ・プロシージャが1つしかない場合は、@NamedStoredProcedureQueryの代わりに@NamedStoredProcedureQueriesを使用できます.
@StoredProcedureParameterは、ストアド・プロシージャのパラメータを表示するために使用されます.特に何もありません.ただし、nameはデータベースのパラメータ名と同じであることに注意してください.
@Name StoredProcedureQueryのprocedureNameもデータベースに格納されているプロシージャの名前と同じです.名前は自分で値を取ることができ、データベースとは関係ありません.
repositoryの寸法方法
entity A対応のrepositoryには、そのストレージ・プロシージャを見つける方法がいくつかあります.
上記の4つの方法のうち、
この方法はだめです.他の3つの方法はすべてできます.実はalias 1でもいいと思います...バグかどうかはわかりませんが....
以上の方法では、メソッド名はストレージプロシージャ名と同じである.
alias 1という方法を使うと間違えます.alias 3に変更する方法が考えられる.メソッドのパラメータに@Param注記を追加すると、エラーは報告されません.(バグだと思います)
上記の方法ではprocedureをデータベースに格納プロセスの名前に設定する必要があるが、利点はalias 3と同様に、メソッド名は勝手に自分で取ることであり、plus 1 inoutメソッド名より固定するしかなく、より柔軟である.
以上の3つの実行可能な方法の中で1つ目が最も簡単だと感じます..注釈のプロパティは何も書かなくてもいいです.唯一要求されるのは、メソッドの名前がストレージプロセスの名前と同じであることである.
その他
spring data jpa呼び出しストレージプロセスは比較的簡単な感じがする.しかし、ストレージ・プロシージャが結果セットを返すとうまく処理できないようです.(いろいろ参考になりましたが.良い解决方法はありません..后で新しい発见があってから更新します)
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呼び出しストレージプロセスは比較的簡単な感じがする.しかし、ストレージ・プロシージャが結果セットを返すとうまく処理できないようです.(いろいろ参考になりましたが.良い解决方法はありません..后で新しい発见があってから更新します)