【问题标题】:Execute stored procedures with multiple parameters and map ResultSet to non-entity class using spring data jpa执行带有多个参数的存储过程,并使用spring data jpa将ResultSet映射到非实体类
【发布时间】:2019-11-16 22:28:11
【问题描述】:

我们最近迁移到 Spring Data JPA(使用 Spring-boot 2.1.5-RELEASE)并且需要执行具有多个输入参数的存储过程并映射到非实体 POJO(我将设置值到实体类,同时保存对象)。谁能提供一个关于如何实现的示例/描述?我没有从文档中得到太多,或者可能我错过了。

任何帮助将不胜感激。

【问题讨论】:

  • 我正试图弄清楚为什么你想只穿一只鞋四处走动。你真的是说你想使用一个没有用@Entity注释的类吗?标有@Entity 注释的 POJO 是,嗯...,只是一个 POJO。如果您不使用注释,您将失去 Spring Data JPA Repositories 的所有好处。如果你不使用@Entity,你还不如回到普通的 Spring Data 存储库。你能澄清一下“non-entity POJO”是什么意思吗?
  • @RandyCasburn 对于我的问题不清楚,我深表歉意。首先,是的,非实体 POJO 是指与数据库中的任何表都不相关的普通 POJO。其次,我想这样做的原因是因为我想执行存储过程,它给我想要保存在普通 POJO 中的对象,然后在需要的地方使用这些对象。我的问题类似于此处提出的问题stackoverflow.com/questions/56859799/…
  • 和 sql 查询(stackoverflow.com/questions/29082749/…)。基本上,需要一个占位符来保存从存储过程返回的对象。

标签: java spring-boot jpa spring-data-jpa spring-data


【解决方案1】:

最直接、最简单的解决方案是用户 SimpleJDBCCall 并忘记此数据资源的 JPA。该文档广泛涵盖了参数。

这样的事情会起作用:

public class MyDao implements SomeDao {

    private JdbcTemplate jdbcTemplate;
    private SimpleJdbcCall procReadStuff;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        this.procReadStuff = new SimpleJdbcCall(dataSource)
                .withProcedureName("my_procedure");
    }

    public void readStuff(Long id) {
        SqlParameterSource in = new MapSqlParameterSource()
                .addValue("in_id", id);
        Map out = procReadStuff.execute(in);
        Stuff stuff = new Stuff();
        stuff.setId(id);
        stuff.setSomeString((String) out.get("out_some_string"));

        // ...do something with Stuff POJO
    }

}

此示例是从文档中的示例中提取/修改的:Documentation

【讨论】:

  • Cashburn,感谢您的回复。然而,在转换为 Spring Boot 之后,我们只实现了 Spring Data JPA,因为它便于编写查询并且更加简洁。 Spring data JPA 中是否没有替代方案来执行与 SimpleJdbcCall 相同的任务?
  • 当然,您不了解或拒绝利用的替代方案。 Spring Data JPA 是迄今为止的推荐 - 但是您想要保存数据的 POJO 需要是 @Entity 和对应的 @Repository。这只是一个 POJO - 我只是不明白你不愿意使用 JPA。它的设计方式。祝你好运。
  • 感谢您的意见。我肯定会对 JPA 做更多的研究。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 2020-09-21
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多