使用spring-data-JPA调用存储过程
2024-09-20 21:21:21
第一种情况,对于只有一个或没有返回值的存储过程,使用如下方式调用:
@Entity
@NamedStoredProcedureQuery(name = "pro1", procedureName = "pro1", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public class User {
@Id @GeneratedValue
private Long id;
}
public interface UserRepository extends CrudRepository<User, Long> {
@Procedure(name = "pro1")
Integer plus1BackedByOtherNamedStoredProcedure(@Param("arg") Integer arg);
}
如果没有返回值,repository中的方法返回void即可。
第二种情况,对于有多个返回值的存储过程,使用如下方式调用:
@Entity
@NamedStoredProcedureQuery(name = "pro1", procedureName = "pro1", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = Integer.class) })
public class User {
@Id @GeneratedValue
private Long id;
}
public class SomeSerice {
@Autowired
private EntityManager entityManager; public void test() {
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("pro1"); query.setParameter("arg", 1); query.execute(); Integer res = query.getOutputParameterValue("res");
Integer res2 = query.getOutputParameterValue("res2");
}
}
第三种情况,对于返回游标的存储过程,使用如下方式:
@Entity
@NamedStoredProcedureQuery(name = "pro1", resultSetMappings={"mapping1"} procedureName = "pro1", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode=ParameterMode.REF_CURSOR, name="cur", type=void.class) }) @SqlResultSetMapping(name="mapping1", classes={@ConstructorResult(targetClass=User.class,
columns={@ColumnResult(name="value1", type=String.class), @ColumnResult(name="value2", type=String.class)})}) public class User {
@Id @GeneratedValue
private Long id; private String value1; private String value2; public User(String value1, String value2) {
this.value1 = value1;
this.value2 = value2;
} //...getter setter
}
注意此处,@NamedStoredProcedureQuery注解增加了resultSetMappings属性,用于定义如何将游标的返回值转换为实体类,具体实现在@SqlResultSetMapping中。实体类需要实现对应的构造函数。
public class SomeSerice {
@Autowired
private EntityManager entityManager; public void test() {
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("pro1"); query.setParameter("arg", 1); query.execute(); query.getResultList();
}
}
最新文章
- Flymeos插桩适配教程
- JS Util1(basic)
- UVA1003(dfs+进制转换)
- C#中,接口不能被实例化,但存在特例
- javascript笔记04:let语句 和 yield语句 和 with语句
- 转载:JSONObject.fromObject(map)(JSON与JAVA数据的转换)
- OpenCV-Python教程(4、形态学处理)
- 从数据库提取数据通过jstl显示在jsp页面上
- jzoj3760. 【BJOI2014】Euler
- smarty文件夹,第一个smarty实例总结
- linux中的&;&;和||(linux中=和==效果是一样的)
- video常用功能
- Python学习笔记-SQLSERVER的大批量导入以及日常操作(比executemany快3倍)
- Exploit-Exercises nebule 旅行日志(五)
- Python基础知识:字符串
- MySQL中使用like查找汉字 Incorrect string value 解决办法
- MD5加密算法Java代码实现
- js之鼠标随动后面跟随事件(类似于长龙跟着跑)
- 代码basic讲解
- 【NOI2015】荷马史诗[Huffman树+贪心]