使用 JPA 2.1 调用存储过程并对 Pojo 执行 Sql Result SetMapping

Posted

技术标签:

【中文标题】使用 JPA 2.1 调用存储过程并对 Pojo 执行 Sql Result SetMapping【英文标题】:Call stored procedure using JPA 2.1 and do Sql Result SetMapping to Pojo 【发布时间】:2016-09-02 14:50:51 【问题描述】:

我正在尝试调用一个使用 JPA 返回非实体对象的存储过程。这就是我所做的。

StoredProcedureQuery query = entityManager.createStoredProcedureQuery(
            "DepAndTerm", "CalendarsMapping");

query.registerStoredProcedureParameter(0, String.class, ParameterMode.IN);
query.registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
query.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
query.registerStoredProcedureParameter(3, String.class, ParameterMode.IN);
query.registerStoredProcedureParameter(4, void.class, ParameterMode.REF_CURSOR);

query.setParameter(0, startDate);
query.setParameter(1, endDate);
query.setParameter(2, eventType);
query.setParameter(3, tType);

query.execute();

List<TCalendar> tCalendars = (List<TCalendar>) query.getOutputParameterValue(4);

@SqlResultSetMapping(
  name = "CalendarsMapping",
  classes = 
    @ConstructorResult(
      targetClass = TCalendar.class,
      columns = 
        @ColumnResult(name="BOutDate"),                 
        @ColumnResult(name="CategoryID"),
        @ColumnResult(name="CategoryName")
      
    )
  
)

我收到以下异常

java.lang.UnsupportedOperationException: org.hibernate.dialect.Oracle10gDialect does not support resultsets via stored procedures
at org.hibernate.dialect.Dialect.getResultSet(Dialect.java:1645) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport.getResultSet(StandardRefCursorSupport.java:125) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.procedure.internal.ProcedureOutputsImpl$ProcedureCurrentReturnState.buildExtendedReturn(ProcedureOutputsImpl.java:106) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.result.internal.OutputsImpl$CurrentReturnState.buildOutput(OutputsImpl.java:209) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.result.internal.OutputsImpl$CurrentReturnState.getOutput(OutputsImpl.java:187) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.result.internal.OutputsImpl.getCurrent(OutputsImpl.java:108) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:234) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]

我不知道我做错了什么。

【问题讨论】:

可能与 Oracle 的 JDBC 驱动程序有关。阅读此blog.harpoontech.com/2013/05/… 【参考方案1】:

在 Hibernate 5.x 中更新到 12c 方言解决了这个问题。我使用的是hibernate 4.2和10g方言。

【讨论】:

以上是关于使用 JPA 2.1 调用存储过程并对 Pojo 执行 Sql Result SetMapping的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 2.1 / Hibernate 4 将值列表传递给存储过程

使用 Spring JPA 调用存储过程

JPA 2.1 - @NamedStoredProcedureQuery - ParameterMode.IN - 空值给出错误

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)

Spring Data JPA调用存储过程实例

Hibernate JPA 存储过程调用?