2016-10-12 2 views
0

Использование JPA, я звоню Server R2 хранимую процедуру MS SQL 2008, который выглядит следующимПолучение запроса выбора из хранимой процедуры с использованием JPA?

procedure [dbo].[testProc] 
    @param1 varchar(max), 
    @param2 datetime 
as 
begin 
EXEC sessionProc 

DECLARE @reportData varbinary(max) 

EXEC aThirdPartyProc 
    @reportData out, 
    @parameter1 = @param1, 
    @date = @param2 

SELECT col1, col2 
FROM fFunction(@reportData) 

end 

При попытке получить результаты от оператора выбора

StoredProcedureQuery q = em.createNamedStoredProcedureQuery("reportData"); 
q.setParameter("param1", "val1"); 
q.setParameter("param2", new Date()); 
return (List<ReportData>) q.getResultList(); 

Я получаю

java.lang.IllegalStateException: Current CallableStatement ou was not a ResultSet, but getResultList was called 
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.getResultList(StoredProcedureQueryImpl.java:319) 

Как получить результаты запроса выбора?

Примечание. Код JPA работает, если я уменьшаю testProc до простого выбора (удалите два оператора EXEC).

Кроме того, вот ReportData объект класса:

@Entity 
@NamedStoredProcedureQuery(name = "reportData", procedureName = "testProc", resultClasses = ReportData.class, parameters = { 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "param1", type = String.class), 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "param2", type = Date.class) 
      }) 
public class ReportData { 
    @Id 
    private String col1; 
    private String col2; 
    // getter and setter for col1 and col2 
} 

Я проверил прок в SQL Server Management Studio и он работает отлично возвращать результаты из отборного заявления.

ответ

0

Ввести параметр с помощью mode = ParameterMode.REF_CURSOR и оставить сохраненную процедуру возвратом refcursor.

, а затем использовать

q.execute(); 
return (List<ReportData>) q.getResultList(); 

См here раздел хранимых процедур с REF_CURSOR

+0

Спасибо за ответ. К сожалению, насколько я могу судить, SQL Server JDBC не поддерживает рефлекторные курсоры. См. [Соответствие JDBC 4.2 Micrsoft] (https://msdn.microsoft.com/en-us/library/mt221491 (v = sql.110) .aspx). В колонке «Примечательная реализация», описывающей метод 'supportRefCursors'' SQLServerDatabaseMetaData', содержится соответствующая информация. Я также пытался (с jTDS и драйвером Microsoft), и я получаю 'Dialect [org.hibernate.dialect.SQLServer2008Dialect], который не поддерживает параметры REF_CURSOR' – James

+0

Привет @James, вы решили проблему с драйверами SQL Server? –

+0

@ Rodolfo Martins - Нет. Я работал над проблемой, разбив исходный хранимый proc на несколько хранимых процедур. Затем, на стороне Java, я вызываю каждый сохраненный процесс. (В моем случае мне нужны были вызовы, выполненные за одну транзакцию). Ответ Дкрута также может работать. Мне нужно отложить время, чтобы проверить. – James

1

Обратная связь от нескольких запросов в пределах SPs бросить JPA прочь, если SET NOCOUNT ON; не используется.

Вставьте SET NOCOUNT ON; после BEGIN в ваш SP.

Использование SET NOCOUNT ON является general best practice.