欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springBoot+JPA调用存储过程

程序员文章站 2022-04-21 12:05:41
...

本文调用存储过程可能会因为情况不同,并不适用所有人。这里就本人遇到的情况,亲测有效,遇到的小伙伴们可以试试。

1、先在实体类中建立与存储过程的联系。


@Entity
 
/**
 *  @Procedure存储过程查询方法
 * 存储过程使用了注解@NamedStoredProcedureQuery 并绑定到一个JPA表。
 * procedureName是数据库中存储过程的名字
 * name是JPA中存储过程的名字
 * 使用注解@StoredProcedureParameter来定义存储过程使用的IN/OU参数
 */
 
@NamedStoredProcedureQuery(name = "ucbe",procedureName = "P_UNIFIED_CREDIT_BATCH_ETL",parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN,name = "fileName",type=String.class),
        @StoredProcedureParameter(mode = ParameterMode.IN,name="linkId",type = String.class)
})
@Table(name="UNIFIED_CREDIT_BATCH_TRA")
public class UnifiedCreditBatchTraPo  {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="UC_SEQ_BATCH_TRA")//调用oracle序列自增
    @SequenceGenerator(name="UC_SEQ_BATCH_TRA",sequenceName="UC_SEQ_BATCH_TRA",allocationSize="1")
    @Column(name="ID")
    private Integer id;
 	
 	@Column(name="CUSTOMERID")
    private String customerId;
 
	@Column(name="LINKID")
    private String linkId;

	@Column(name="FILENAME")
    private String fileName;
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getCustomerId() {
        return customerId;
    }
 
    public void setCustomerId(String customerId) {
        this.customerId= customerId;
    }
 
    public String getLinkId() {
        return linkId;
    }
 
    public void setLinkId(String linkId) {
        this.linkId= linkId;
    }

	public String getFileName() {
        return fileName;
    }
 
    public void setFileName(String fileName) {
        this.fileName= fileName;
    }
}

2、dao层调用存储过程

public interface UnifiedCreditBatchTraDao extends JpaRepository<UnifiedCreditBatchTraPo,String>{
   /**
     * 调用存储过程
     * pluslinout 存储过程名字
     * @param arg
     * @return
     */
    @Procedure(procedureName = "P_UNIFIED_CREDIT_BATCH_ETL")
    void unifiedCreditBatchEtl(String fileName,String linkId);
}

3、控制层调用dao层方法

@RestController
public class UnifiedCreditController {
    @Autowired
    private UnifiedCreditBatchTraDao unifiedCreditBatchTraDao;
 
  
    /**
     * @Procedure
     * 调用存储过程
     */
    @RequestMapping("doProcedure")
    public void doProcedure(String fileName,String linkId){
		try{
			unifiedCreditBatchTraDao.unifiedCreditBatchEtl(fileName,linkId);
		}catch{
			logger.error("存储过程调用失败",e)
		}       
    }
}

注意:本例中存储过程只有传入参数,没有返回参数。如果存储过程有返回值,可在实体类中通过@StoredProcedureParameter(mode = ParameterMode.OUT,name="res",type = Integer.class)来定义。在dao层根据返回值来定义返回类型。