第一种情况,对于只有一个或没有返回值的存储过程,使用如下方式调用:

@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();
}
}

最新文章

  1. Flymeos插桩适配教程
  2. JS Util1(basic)
  3. UVA1003(dfs+进制转换)
  4. C#中,接口不能被实例化,但存在特例
  5. javascript笔记04:let语句 和 yield语句 和 with语句
  6. 转载:JSONObject.fromObject(map)(JSON与JAVA数据的转换)
  7. OpenCV-Python教程(4、形态学处理)
  8. 从数据库提取数据通过jstl显示在jsp页面上
  9. jzoj3760. 【BJOI2014】Euler
  10. smarty文件夹,第一个smarty实例总结
  11. linux中的&amp;&amp;和||(linux中=和==效果是一样的)
  12. video常用功能
  13. Python学习笔记-SQLSERVER的大批量导入以及日常操作(比executemany快3倍)
  14. Exploit-Exercises nebule 旅行日志(五)
  15. Python基础知识:字符串
  16. MySQL中使用like查找汉字 Incorrect string value 解决办法
  17. MD5加密算法Java代码实现
  18. js之鼠标随动后面跟随事件(类似于长龙跟着跑)
  19. 代码basic讲解
  20. 【NOI2015】荷马史诗[Huffman树+贪心]

热门文章

  1. 【Spring学习笔记-MVC-8】SpringMVC之类型转换Converter
  2. Hyperic Sigar API 举例
  3. mysql实战优化之九:MySQL查询缓存总结
  4. shell 6基本运算符
  5. Solr --- Group查询与Facet区别
  6. uva140-暴力枚举
  7. css属性 writing-mode 改变文字书写方向
  8. as3 加载gif loader
  9. CAShapeLayer 画直线
  10. XmlHttpRequest对象 ajax核心之一