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 提供商:Hibernate/EclipseLink 的市场份额?