powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
25 сообщений из 47, страница 1 из 2
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070265
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, мое положение заставляет обратиться к вам за помощью в отдельной теме (после поиска решения в интернете и на sql.ru в частности).

Затея: вызвать MS SQL 2008 процедуру с помощью Hibernate 4 и вывести (обработать) два возвращаемых ей значения на экран.

Процедура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE PROCEDURE [dbo].[PRODUCT_CREATE](
        @ReturnValue INT output,
        @ProductID INT output,
        @PassID numeric(18,0),
        @Amount numeric(18,2))
  as
BEGIN
print 'PassID = ' + convert(varchar,  @PassID);
print 'Amount  = ' + convert(varchar, @Amount);
select @ReturnValue     = 999999,
       @ProductID       = 777777;
END; 




Mapping:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <sql-query name="PRODUCT_CREATE" callable="true">
        <return-scalar column = "ReturnValue" type="int"/>
        <return-scalar column = "ProductID" type="int"/>
        <![CDATA[{CALL PRODUCT_CREATE (:ReturnValue, 
                                            :ProductID, 
                                            :PassID, 
                                            :Amount 
                                            )}]]>
  </sql-query>
</hibernate-mapping>




Main class:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
package app;

import java.math.BigInteger;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;

public class App {
	
	
	public static void main(String[] args) {
		
		App.createProduct();
			
		
		}
	

	
	public static BigInteger createProduct()
	{
		/**
		 * Open session and begin database transaction for database operation.
		 */
		SessionFactory sf =  HibernateUtil.createSessionFactory();
		Session session = sf.openSession();
		Query  qr = session.getNamedQuery("PRODUCT_CREATE");

		qr.setParameter("ReturnValue", 0); 
		qr.setParameter("ProductID", 0);
		qr.setParameter("PassID", new BigInteger("1000999"));
		qr.setParameter("Amount", new BigInteger("1000001"));

		@SuppressWarnings("unchecked")
         /*Вот тут возникает ошибка*/
		List<ProductModel> list = qr.setResultTransformer(Transformers.aliasToBean(ProductModel.class)).list(); 

		for(int i=0; i<list.size(); i++){
			ProductModel prd = (ProductModel)list.get(i);
		System.out.println(String.valueOf(prd.getCardId()));
		}

		session.getTransaction().commit();
		session.close();

		return null;

	}


}



Установка соединения:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
package app;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	private static ServiceRegistry serviceRegistry;
	
	
	/**
	 * Create hibernate configuration.
	 */
	Configuration c = new Configuration().configure("/resources/hibernate.cfg.xml");
	
	
	public static SessionFactory createSessionFactory() {
	
		try
		{
		Configuration configuration = new Configuration();
	    configuration.configure();
	    serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
	            configuration.getProperties()).build();
	    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	    return sessionFactory;
	    
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.out.print("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}
	
}




Модель возвращаемого объекта:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
package app;

public class ProductModel {
	
	private int ReturnValue;
	private int ProductID;
	
	
	public ProductModel(int returnValue, int productID) {
		super();
		ReturnValue = returnValue;
		ProductID = productID;
	}


	public int getReturnValue() {
		return ReturnValue;
	}


	public void setReturnValue(int returnValue) {
		ReturnValue = returnValue;
	}


	public int getProductID() {
		return ProductID;
	}


	public void setProductID(int productID) {
		ProductID = productID;
	}

}




Hibernate конфиг:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="connection.url">jdbc:sqlserver://.......</property>
    <property name="connection.username">user</property>
    <property name="connection.password">pass</property>
    <property name="connection.pool_size">10</property>
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="show_sql">true</property>
    <property name="hibernate.connection.autocommit">true</property>
    <!--<property name="current_session_context_class">thread</property> -->

    <mapping resource="app/PRODUCT_CREATE.hbm.xml"></mapping>
    
  </session-factory>
</hibernate-configuration>



POM:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<properties>
	    <java.version>1.8</java.version>
        <jdk.version>1.8</jdk.version>
        <hibernate.version>4.3.8.Final</hibernate.version>
        <hibernate.jpa.version>1.0.0.Final</hibernate.jpa.version>
	</properties>

 <dependencies>
 
  <!--Hibernate-->
            <dependency>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.1-api</artifactId>
                <version>${hibernate.jpa.version}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
   
   
   <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>sqljdbc4</artifactId>
        <version>4.0</version>
   </dependency>
    </dependencies>





При выполнении программы возникает ошибка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Exception in thread "main" java.lang.NullPointerException
	at org.hibernate.loader.Loader.processResultSet(Loader.java:950)
	at org.hibernate.loader.Loader.doQuery(Loader.java:921)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
	at org.hibernate.loader.Loader.doList(Loader.java:2554)
	at org.hibernate.loader.Loader.doList(Loader.java:2540)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
	at org.hibernate.loader.Loader.list(Loader.java:2365)
	at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)
	at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1873)
	at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
	at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
	at app.App.createProduct(App.java:46)
	at app.App.main(App.java:16)

Помогите ее исправить и вывести в консоль два возвращаемых процедурой параметра?
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070343
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,

RTFM:
http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch13.html#sp_query Hibernate provides support for queries via stored procedures and functions. Most of the following documentation is equivalent for both. The stored procedure/function must return a resultset as the first out-parameter to be able to work with Hibernate.
...
13.2.2.1. Rules/limitations for using stored procedures
...


Хранимка должна возвращать ResultSet, а не просто значения через OUT параметры.
Если нужны просто значения, то можно вытащить Connection из сессии и запускать хранимку через JDBC API
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070412
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо.
Т.е. мне каким-то образом нужно сделать так чтобы процедура возвращала курсор? Не очень представляю как это в MS SQL. Пойду искать.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070527
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Blazkowicz, спасибо.
Т.е. мне каким-то образом нужно сделать так чтобы процедура возвращала курсор? Не очень представляю как это в MS SQL. Пойду искать.

Что там искать??
https://www.google.com/search?q=t-sql return results from stored procedure
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070534
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

я извиняюсь, но мне не удалось найти пример ms sql процедуры которая возвращает курсор.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070549
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все как - то предлагают получать result set через временные таблицы.

Blazkowicz, если бы процедура возвращала один единственные параметр, это упростило бы задачу или все равно нужно возвращать резалтсет?
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070554
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,

Перестаньте использовать термин ms sql
Сервер называется SQL Server. Используемый им диалект SQL называется T-SQL.
Ссылку с примерами привел выше.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070587
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, да, извините, конечно transact sql.
Еще раз спасибо за линк на результаты поиска, но повторюсь, не увидела примера, где процедура возвращает курсор. Курсор - это в данному случае result set. Не было бы ветки , если бы для меня было бы все очевидно, как, наверное, для Вас.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070598
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Blazkowicz, да, извините, конечно transact sql.
Еще раз спасибо за линк на результаты поиска, но повторюсь, не увидела примера, где процедура возвращает курсор. Курсор - это в данному случае result set. Не было бы ветки , если бы для меня было бы все очевидно, как, наверное, для Вас.
Ну, если в лоб, то да, скорее всего через временную таблицу.
Но подойдите с другой стороны к проблеме
- Обязательно ли вызывать через Hibernate API, а не JDBC?
- Обязательно ли это должна быть "хранимка", а не например, "вьюха"?
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070615
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, к сожалению - да, хотелось бы через Hibernate API.

Вот, нашелся пример, когда процедура возвращает курсор:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor 
    @CurrencyCursor CURSOR VARYING OUTPUT
AS
    SET NOCOUNT ON;
    SET @CurrencyCursor = CURSOR
    FORWARD_ONLY STATIC FOR
      SELECT CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @CurrencyCursor;
GO




Попробую.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070655
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не получается. эх....
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070742
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12, буду пробовать с одной возвращаемое переменной.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070768
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12May12, буду пробовать с одной возвращаемое переменной.
Что это меняет?
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070787
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, поняла, что по ничего.
Прихожу к выводу что Hibernate не может работать с t-sql процедурами возвращающими значения.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070801
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Blazkowicz, поняла, что по ничего.
Прихожу к выводу что Hibernate не может работать с t-sql процедурами возвращающими значения.
цель тестировать хибер или вернуть коллекцию объектов их хранимки?
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070811
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, здравствуйте. Уже не тестирование; вернуть коллекцию объектов их хранимки Хибером . Ну если это невозможно, то я забью. Просто время потрачено, хотелось бы доделать и думалось что это некая тривиальная задача для этого фреймворка в виду его разракламированности.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070846
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12то я забью.
забивай)
Он не для тебя)
Вишь в первой мессаге ты 1000 строк понаписал.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070860
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, ну Вы то знаете как получить результат в данном случае?
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070869
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Petro123, ну Вы то знаете как получить результат в данном случае?
абстрактные задачи решают философы.
Хибер решает CRUD.
Там другой маппинг.
Он в этом хороший))
А ты блонинку используешь как брюнетку).
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070872
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123А ты блонинку используешь как брюнетку).
У меня есть серьезные подозрения, что May12 - дама. Поэтому не самая удачная аллегория.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070877
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. через callable statement JDBC API делать...
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070880
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Уже не тестирование; вернуть коллекцию объектов их хранимки Хибером .
Если хранимка сама не возвращает коллекцию, то при чем тут хибер? Его бага только в том что он NPE выкидывает, когда следовало бы иметь более внятное исключение.

May12Ну если это невозможно, то я забью.
Просто время потрачено, хотелось бы доделать и думалось что это некая тривиальная задача для этого фреймворка в виду его разракламированности.
Это называется "вам шашечки или ехать"? Верните выборку из временной таблицы и будет вам счастье. Вы же сами говорите о какой-то коллекции, которой у вас в БД и нет совсем.
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070930
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПоэтому не самая удачная аллегория.
да да)))
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39070933
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12т.е. через callable statement JDBC API делать...
пока вы тренируетесть и скучаете, решений полно:
- т.к. хранимки, то для них есть полуХибер - iBatis.
- хибер стандартно работает с таблицами, а не с их фасадом - хранимками.
- можно без хибера но вам не нравится
как то так...
...
Рейтинг: 0 / 0
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
    #39071146
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваще хибер лишний, без него проще - всё по контролем.
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]