使用 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存储库时的NoSuchMethodError(getMetaModel)