使用 Spring Boot 和 JPA 将存储过程输出到 Java 自定义对象中

Posted

技术标签:

【中文标题】使用 Spring Boot 和 JPA 将存储过程输出到 Java 自定义对象中【英文标题】:Stored procedure output into Java custom Object using Spring boot and JPA 【发布时间】:2019-09-18 12:27:51 【问题描述】:

我创建了存储过程来从数据库中获取数据并将响应转换为 Java 对象。当我尝试在自定义对象中捕获响应时遇到问题。 (注意:我给出的示例仅用于测试。我知道有一种简单的方法可以执行我在这里尝试执行的操作。但这只是为了解释)

存储过程:

CREATE PROCEDURE [dbo].[getVersionByName] @name nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for procedure here
    SELECT * FROM [version] where [name] = @name
END

版本实体:

@Entity
@NoArgsConstructor
@Data
@NamedStoredProcedureQuery(name = "Version.getVersionListedName"
                , procedureName = "getVersionByName"
                , parameters = 
                    @StoredProcedureParameter(mode = ParameterMode.IN,name = "name", type = String.class))
public class Version 
    @Id
    private Long id;
    private String name;

存储库:

public interface VersionRepositoryExtended extends CrudRepository<Version, Long> 

    @Procedure(procedureName = "getVersionByName")
    public Version getVersionListedName(@Param("name") String name);

问题: 如果你看到我的存储过程,有一个'SELECT * ---'语句。我正在尝试将该输出作为返回值捕获到我的 Java 代码中。我该怎么做?

更新

当我尝试编译代码时,出现以下错误: org.springframework.data.mapping.PropertyReferenceException:没有找到类型版本的属性 getVersionListedName!

【问题讨论】:

你试过SELECT id, name而不是SELECT *吗? 我收到此错误:org.springframework.data.mapping.PropertyReferenceException: No property getVersionListedName found for type Version! @Taylor 我需要先修复此错误,然后才能对其进行测试。 如果这是错误的,请原谅我,但这个查询的存储过程似乎有点矫枉过正?您可以将存储库方法名称设为findByName,spring-data 应该根据方法名称为您生成正确的查询。有关详细信息,请参阅these docs。 @Taylor 我在问题中提到(作为注释)我创建此 SP 仅用于测试目的,并且我知道该解决方案。尝试存储过程。 【参考方案1】:

适用于 Oracle 数据库

@Entity
@NoArgsConstructor
@Data
@NamedStoredProcedureQuery(name = "Version.NamedQuery_getVersionListedName"
                , procedureName = "getVersionByName"
                , parameters = 
                    @StoredProcedureParameter(
                        mode = ParameterMode.IN,
                        name = "name", 
                        type = String.class),
                    @StoredProcedureParameter(
                        mode = ParameterMode.REF_CURSOR,
                        name = "OUT", 
                        type = Class.class)
                  )
public class Version 
    public static final String NamedQuery_getVersionListedName = "getVersionListedName";
    @Id
    private Long id;
    private String name;

public interface VersionRepositoryExtended extends CrudRepository<Version, Long> 

    @Procedure(name = Version.NamedQuery_getVersionListedName)
    public Version getVersionListedName(@Param("name") String name);

【讨论】:

以上是关于使用 Spring Boot 和 JPA 将存储过程输出到 Java 自定义对象中的主要内容,如果未能解决你的问题,请参考以下文章

即使 @Transactional 放置在服务层中,Spring boot JPA 存储库也会提交代码

如何使用 Spring Boot JPA 在 Postgres 中存储几何点?

Spring Boot JPA:将实体存储为 JSON

使用Spring BOOT集成测试JPA存储库时的NoSuchMethodError(getMetaModel)

使用 jparepository 调用存储过程 Spring Boot 应用程序

Spring Boot JPA 存储库查询