網上這方面的例子不是不少,研究了一下,列出幾個調用的方法.java
假如咱們有一個mysql的存儲過程mysql
CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT) BEGIN SET res = ARG + 1; END
就是傳入一個int參數,返回這個參數+1.spring
若是咱們要調用這個存儲過程的話.能夠這麼作.sql
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); } }
隨便找一個entity就能夠了若是有多個存儲過程,能夠用@NamedStoredProcedureQueries就像我上面同樣.若是隻有1個存儲過程,能夠用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.數據庫
@StoredProcedureParameter 是用來標註存儲過程的參數的..沒啥特別的.只是要注意name和數據庫裏的參數名字同樣.ide
@NamedStoredProcedureQuery裏面procedureName 也要與數據庫中存儲過程的名字同樣.而name能夠本身取值,與數據庫沒有關係this
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裏有多中方法均可以找到那個存儲過程spa
@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個方法中只有code
Integer alias1(Integer arg);
這個方法不行,其餘3種方法均可以..其實我以爲alias1應該也是能夠的...不知道是否是bug....component
@Procedure Integer plus1inout(Integer arg);
用上面這個方法的話方法名要與存儲過程名同樣.
@Procedure(name="plus1") Integer alias1(Integer arg);
用alias1這個方法的話會報錯.能夠考慮改爲alias3那種方法.爲方法的參數增長@Param註解,就不會報錯了.(我以爲這是個bug)
@Procedure(procedureName="plus1inout") Integer alias2(Integer arg);
上面這種方法的話須要將procedure設置成數據庫裏存儲過程的名字,好處與alias3同樣,就是方法名隨便本身取,相比plus1inout方法名只能固定,更靈活一些.
感受以上3種可行的方法裏第一種最簡單..什麼註解的屬性都不用寫..惟一要求的就是方法的名字與存儲過程名字同樣.
感受spring data jpa 調用存儲過程仍是比較簡單的.可是若是存儲過程返回一個結果集的話好像不能很好的處理..(看了不少參考.都沒有什麼好的解決辦法..後續有新發現再更新)