Java 为什么Spring Data JPA中的实体上有存储过程元数据定义?

Java 为什么Spring Data JPA中的实体上有存储过程元数据定义?,java,spring,jpa,spring-boot,spring-data-jpa,Java,Spring,Jpa,Spring Boot,Spring Data Jpa,我想用Spring引导数据JPA配置我的应用程序,并调用一个存储过程。然而,在搜索web之后,我发现这种方法必须使用某种“实体表” 这可以被视为解释,例如 但是,我不明白为什么需要在实体上绑定存储过程元数据定义?如果我没有这样的实体表怎么办?没有其他方法吗?您链接的页面解释了如何从字符串数据JPA调用存储过程 我知道这看起来很奇怪。他们说,您需要定义一个实体来承载对它的存储过程调用 那么为什么要使用Spring数据而不是JDBC调用呢?我只能猜测: 您不想处理打开/关闭/缓存JDBC资源的问题

我想用Spring引导数据JPA配置我的应用程序,并调用一个存储过程。然而,在搜索web之后,我发现这种方法必须使用某种“实体表”

这可以被视为解释,例如


但是,我不明白为什么需要在实体上绑定存储过程元数据定义?如果我没有这样的实体表怎么办?没有其他方法吗?

您链接的页面解释了如何从字符串数据JPA调用存储过程

我知道这看起来很奇怪。他们说,您需要定义一个实体来承载对它的存储过程调用

那么为什么要使用Spring数据而不是JDBC调用呢?我只能猜测:

  • 您不想处理打开/关闭/缓存JDBC资源的问题
  • 你的应用程序有严格的规则:每个数据库访问都必须通过Spring数据

您可以在存储库界面中使用类似的方法直接调用存储过程

@Procedure(procedureName = "test_pkg.in_and_out_test")
String callStoredProc(Long id, String p_method);

最后,经过一些研究,我不打算使用
Spring数据JPA
调用存储过程。相反,我将选择
springjdbctemplate

以下是如何做到这一点:

1) 在
pom.xml
中添加以下依赖项(请注意,我使用的是Spring Boot):

3) 在DAO类中,您可以使用类似于下面给出的内容:

    LOGGER.info("Calling stored proc...");
    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withSchemaName("test").withProcedureName("test_proc");
    SqlParameterSource in = new MapSqlParameterSource().addValue("name", "akshay");
    Map<String, Object> out = simpleJdbcCall.execute(in);
    LOGGER.info("Output from procedure: {}", out.get("fullname"));
    LOGGER.info("Returned from stored proc.");
LOGGER.info(“调用存储过程…”);
SimpleJdbcCall SimpleJdbcCall=新的SimpleJdbcCall(jdbcTemplate)。使用Schemaname(“测试”)。使用ProcedureName(“测试程序”);
SqlParameterSource in=new-MapSqlParameterSource().addValue(“名称”、“akshay”);
Map out=simpleJdbcCall.execute(in);
info(“过程的输出:{}”,out.get(“全名”);
LOGGER.info(“从存储过程返回”);
更多信息可在此处获得:


干杯

谢谢,但我相信存储库又是“表”特定的,不是吗?示例:公共接口MyDataRepo扩展了JpaRepository。那么,如果我说有10张表和10份回购协议,你提到的正确申报地点在哪里?这难道不具有误导性吗?
@Autowired
private JdbcTemplate jdbcTemplate;
    LOGGER.info("Calling stored proc...");
    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withSchemaName("test").withProcedureName("test_proc");
    SqlParameterSource in = new MapSqlParameterSource().addValue("name", "akshay");
    Map<String, Object> out = simpleJdbcCall.execute(in);
    LOGGER.info("Output from procedure: {}", out.get("fullname"));
    LOGGER.info("Returned from stored proc.");