Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4 / 25 сообщений из 47, страница 1 из 2
07.10.2015, 10:46
    #39070265
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Ребят, мое положение заставляет обратиться к вам за помощью в отдельной теме (после поиска решения в интернете и на 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
07.10.2015, 11:41
    #39070343
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
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
07.10.2015, 12:14
    #39070412
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Blazkowicz, спасибо.
Т.е. мне каким-то образом нужно сделать так чтобы процедура возвращала курсор? Не очень представляю как это в MS SQL. Пойду искать.
...
Рейтинг: 0 / 0
07.10.2015, 13:01
    #39070527
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12Blazkowicz, спасибо.
Т.е. мне каким-то образом нужно сделать так чтобы процедура возвращала курсор? Не очень представляю как это в MS SQL. Пойду искать.

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

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

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

Перестаньте использовать термин ms sql
Сервер называется SQL Server. Используемый им диалект SQL называется T-SQL.
Ссылку с примерами привел выше.
...
Рейтинг: 0 / 0
07.10.2015, 13:26
    #39070587
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Blazkowicz, да, извините, конечно transact sql.
Еще раз спасибо за линк на результаты поиска, но повторюсь, не увидела примера, где процедура возвращает курсор. Курсор - это в данному случае result set. Не было бы ветки , если бы для меня было бы все очевидно, как, наверное, для Вас.
...
Рейтинг: 0 / 0
07.10.2015, 13:30
    #39070598
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12Blazkowicz, да, извините, конечно transact sql.
Еще раз спасибо за линк на результаты поиска, но повторюсь, не увидела примера, где процедура возвращает курсор. Курсор - это в данному случае result set. Не было бы ветки , если бы для меня было бы все очевидно, как, наверное, для Вас.
Ну, если в лоб, то да, скорее всего через временную таблицу.
Но подойдите с другой стороны к проблеме
- Обязательно ли вызывать через Hibernate API, а не JDBC?
- Обязательно ли это должна быть "хранимка", а не например, "вьюха"?
...
Рейтинг: 0 / 0
07.10.2015, 13:36
    #39070615
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
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
07.10.2015, 13:51
    #39070655
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Не, не получается. эх....
...
Рейтинг: 0 / 0
07.10.2015, 14:22
    #39070742
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12, буду пробовать с одной возвращаемое переменной.
...
Рейтинг: 0 / 0
07.10.2015, 14:34
    #39070768
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12May12, буду пробовать с одной возвращаемое переменной.
Что это меняет?
...
Рейтинг: 0 / 0
07.10.2015, 14:48
    #39070787
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Blazkowicz, поняла, что по ничего.
Прихожу к выводу что Hibernate не может работать с t-sql процедурами возвращающими значения.
...
Рейтинг: 0 / 0
07.10.2015, 14:56
    #39070801
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12Blazkowicz, поняла, что по ничего.
Прихожу к выводу что Hibernate не может работать с t-sql процедурами возвращающими значения.
цель тестировать хибер или вернуть коллекцию объектов их хранимки?
...
Рейтинг: 0 / 0
07.10.2015, 15:01
    #39070811
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Petro123, здравствуйте. Уже не тестирование; вернуть коллекцию объектов их хранимки Хибером . Ну если это невозможно, то я забью. Просто время потрачено, хотелось бы доделать и думалось что это некая тривиальная задача для этого фреймворка в виду его разракламированности.
...
Рейтинг: 0 / 0
07.10.2015, 15:17
    #39070846
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12то я забью.
забивай)
Он не для тебя)
Вишь в первой мессаге ты 1000 строк понаписал.
...
Рейтинг: 0 / 0
07.10.2015, 15:22
    #39070860
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Petro123, ну Вы то знаете как получить результат в данном случае?
...
Рейтинг: 0 / 0
07.10.2015, 15:25
    #39070869
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12Petro123, ну Вы то знаете как получить результат в данном случае?
абстрактные задачи решают философы.
Хибер решает CRUD.
Там другой маппинг.
Он в этом хороший))
А ты блонинку используешь как брюнетку).
...
Рейтинг: 0 / 0
07.10.2015, 15:27
    #39070872
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
Petro123А ты блонинку используешь как брюнетку).
У меня есть серьезные подозрения, что May12 - дама. Поэтому не самая удачная аллегория.
...
Рейтинг: 0 / 0
07.10.2015, 15:29
    #39070877
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
т.е. через callable statement JDBC API делать...
...
Рейтинг: 0 / 0
07.10.2015, 15:29
    #39070880
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов MS SQL хранимой процедуры с двумя исходящими параметрами из Hibernate 4
May12Уже не тестирование; вернуть коллекцию объектов их хранимки Хибером .
Если хранимка сама не возвращает коллекцию, то при чем тут хибер? Его бага только в том что он NPE выкидывает, когда следовало бы иметь более внятное исключение.

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


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