springboot_springdata-jpa @Procedure呼叫儲存過程查詢方法
阿新 • • 發佈:2018-12-05
專案地址: https://github.com/heng1234/springdata-jpa
1、mysql資料建立表和儲存過程
CREATE TABLE `user` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `name` VARCHAR (50) NOT NULL, `email` VARCHAR (200) NOT NULL, PRIMARY KEY (`id`) ) -- 建立儲存過程 create procedure pluslinout(IN arg int, OUT res int) BEGIN select (arg+10) into res; END
2、在springboot專案建立User Entity
package com.hvly.springjp_1.com.hlvy.entity; import lombok.Data; import javax.persistence.*; /** * User * * @author heng **/ //@Data//lombok裡的 @Entity(name = "User") /** * @Procedure儲存過程查詢方法 * 呼叫資料庫儲存過程需要在實體類定義定義 * name: 在EntityManager中的名字 NamedStoredProcedureQuery使用 * procedureName: 資料庫裡儲存過程的名字 * parameters: 使用IN/OUT引數 * * 儲存過程使用了註解@NamedStoredProcedureQuery 並繫結到一個JPA表。 * procedureName是儲存過程的名字 * name是JPA中儲存過程的名字 * 使用註解@StoredProcedureParameter來定義儲存過程使用的IN/OU參書 */ @NamedStoredProcedureQuery(name = "User.plusl",procedureName = "pluslinout",parameters = { @StoredProcedureParameter(mode = ParameterMode.IN,name = "arg",type=Integer.class), @StoredProcedureParameter(mode = ParameterMode.OUT,name="res",type = Integer.class) }) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)//自動增遞 private Long id; private String name; private String email; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
JpaRepository
package com.hvly.springjp_1.com.hlvy.repository; import com.hvly.springjp_1.com.hlvy.entity.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.*; import org.springframework.data.jpa.repository.query.Procedure; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; import javax.persistence.QueryHint; import java.util.List; /** * UserRepository * * @author heng **/ public interface UserJpaRepository extends JpaRepository<User,Long> , JpaSpecificationExecutor<User> { /** * 呼叫儲存過程 * pluslinout 儲存過程名字 * @param arg * @return */ @Procedure("pluslinout") Integer explicitlyNamedPluslinout(Integer arg); /** * 呼叫儲存過程 * pluslinout 儲存過程名字 * @param arg * @return */ @Procedure(procedureName = "pluslinout") Integer pluslinout(Integer arg); /** * User.pluslIO自定義儲存過程的名字 * @param arg * @return */ @Procedure(name = "User.plusl") Integer entityAnnotatedCustomNamedProcedurePluslIO(@Param("arg") Integer arg); }
Controller
package com.hvly.springjp_1.com.hlvy.controller;
import com.hvly.springjp_1.com.hlvy.entity.SeLPUser;
import com.hvly.springjp_1.com.hlvy.entity.User;
import com.hvly.springjp_1.com.hlvy.repository.SpELUserRepository;
import com.hvly.springjp_1.com.hlvy.repository.UserAtRepository;
import com.hvly.springjp_1.com.hlvy.repository.UserJpaRepository;
import com.hvly.springjp_1.com.hlvy.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.JpaSort;
import org.springframework.web.bind.annotation.*;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;
/**
* UserController
*
* @author heng
**/
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserJpaRepository userJpaRepository;
/**
* @Procedure
* 呼叫儲存過程
*/
@RequestMapping("explicitlyNamedPluslinout")
public Integer explicitlyNamedPluslinout(int arg){
// return userJpaRepository.explicitlyNamedPluslinout(arg);//呼叫成功
// return userJpaRepository.pluslinout(arg);//呼叫成功
return userJpaRepository.entityAnnotatedCustomNamedProcedurePluslIO(arg);//呼叫成功
}
}