Использование 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 и он работает отлично возвращать результаты из отборного заявления.
Спасибо за ответ. К сожалению, насколько я могу судить, 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
Привет @James, вы решили проблему с драйверами SQL Server? –
@ Rodolfo Martins - Нет. Я работал над проблемой, разбив исходный хранимый proc на несколько хранимых процедур. Затем, на стороне Java, я вызываю каждый сохраненный процесс. (В моем случае мне нужны были вызовы, выполненные за одну транзакцию). Ответ Дкрута также может работать. Мне нужно отложить время, чтобы проверить. – James