1. 程式人生 > >spring data jpa 如何呼叫mysql儲存過程?

spring data jpa 如何呼叫mysql儲存過程?

 

A:首先定義儲存過程依賴的jpa表:
    @Entity
    @Table(name="evenmngt_childthingtree_tmp")//資料庫中的表名
    @NamedStoredProcedureQuery(name = "getChildTree1", procedureName = "eventmngt.getChildTree1",
        parameters = {@StoredProcedureParameter(mode= ParameterMode.IN,name = "thingnums", type = String.class)}
    )
    //此處的@NamedStoredProcedureQuery就是要和資料庫裡面的儲存過程要對應,
    //java實體類                                     資料庫
    //getChildTree1(java實體類的儲存過程名稱)     eventmngt.getChildTree1(資料庫名.儲存過程名稱)
 //@StoredProcedureParameter 儲存過程引數型別註解(mode 引數模式[三種 in out  in+out],name 引數名稱:要和資料庫儲存過程定義的引數名稱相同
  //type引數型別:引數型別的class物件)                                
    public class ChildThingTree implements Serializable{
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int id;
        
        @Column(name="parentthingnum")
        private String parentThingNum;//父事情編號
        
        @Column(name="thingnum")
        private String thingNum;//事情編號
        
        @Column(name="lev")
        private int lev;//級別;
        
        @Column(name="count")
        private int count;//
        
        ...此處省略
        get 或set 方法;
        
        ...重寫toString()方法此處省略
        toString()方法
    }
   B定義持久層介面方法 呼叫儲存過程
    @Repository
    @Transactional
    public interface ChildThingTreeDao extends CrudRepository<ChildThingTree, String>,JpaRepository<ChildThingTree, String> {

        @Procedure(name = "getChildTree1")//此處的name 要和實體類裡@NamedStoredProcedureQuery註解的name屬性值要一樣,否則會報錯。

 

        public void getChildTree1(@Param("thingnums") String thingnums);

        //(@Param註解裡的名字要和@StoredProcedureParameter裡的name屬性值一樣

 

    }
    C:在service層直接呼叫儲存過程
       @Autowired
       private ChildThingTreeDao childThingTreeDao;
       childThingTreeDao.getChildTree1(param);
    D: 至此儲存過程的呼叫就完了。