JPA 2.1、Eclipselink、SQL Server、Spring - NamedStoredProcedureQuery 结果映射

Posted

技术标签:

【中文标题】JPA 2.1、Eclipselink、SQL Server、Spring - NamedStoredProcedureQuery 结果映射【英文标题】:JPA 2.1, Eclipselink, SQL Server, Spring - NamedStoredProcedureQuery result mapping 【发布时间】:2016-04-26 15:16:35 【问题描述】:

使用javax或eclipse链接@NamedStoredProcedureQuery,我想调用一个没有cursor或andout参数的sql server存储过程并返回结果集,而不必手动映射结果。

当我使用弹簧@Procedure 时,会自动添加一个 OUT 参数,并且我从数据库返回错误,说我有太多参数,这是有道理的。如果我不这样做,我只能返回 void 但无法获得结果。

有没有办法通过映射参数然后手动映射结果集来避免所有样板代码?由于存储过程是共享的,因此我更改存储过程的能力有限。

我正在寻找一些示例,说明如何使用实体为没有 OUT 参数或游标的存储过程映射结果。 (我怀疑这是不可能的,但我想听听那些使用这些东西的时间比我长(2 天)的人的话)

PS 我已经看到使用 Oracle 完成了这项工作,但是他们定义了一个 out 参数。

ALTER PROCEDURE [dbo].[spGetInstitution] -- Add the parameters for the stored procedure here @InstitutionID INT 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 a.InstitutionID, a.DisplayName FROM tblInstitution a WHERE a.InstitutionID = @InstitutionID END

【问题讨论】:

【参考方案1】:

您看过StoredProcedureQuery 的文档吗?如果您的过程返回一个结果集,如果您在创建查询时指定了 resultClasses 或 resultSetMappings(如果需要),则 getResultList 将起作用。

类似:

StoredProcedureQuery query = em.createStoredProcedureQuery("spGetInstitution", Institution.class);
query.registerStoredProcedureParameter("InstitutionID", Integer.class, ParameterMode.IN);
query.setParameter("InstitutionID", institutionID);

boolean result = query.execute();
assertTrue("Result did not return true for a result set.", result);

List<Institution> institutionResults = query.getResultList();

【讨论】:

这就是我最终使用的。我希望不必手动映射参数,因为我要编写数百个参数,而@Procedure 允许这样做。经过两天的互联网搜索,我认为这是给定选项的最佳解决方案。

以上是关于JPA 2.1、Eclipselink、SQL Server、Spring - NamedStoredProcedureQuery 结果映射的主要内容,如果未能解决你的问题,请参考以下文章

从日期开始的日期 EXTRACT(DAY,s.date) 不起作用 jpa 和 eclipseLink

EclipseLink/JPA 是不是有用于修改生成的 SQL 的插件框架?

jpa 2.1 的生产就绪持久性提供程序

评估 JPA 提供商:Hibernate/EclipseLink 的市场份额?

JPA 使用指南 /Eclipselink/JPA 实体生成器

JPA - EclipseLink - 如何更改默认模式