Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate? / 13 сообщений из 13, страница 1 из 1
17.06.2013, 11:24:29
    #38299613
futurologx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Есть хранимая процедура

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROC dbo.insertData 
    @param1 nvarchar(11),
    @param2 nvarchar(30),
    @ID bigint OUTPUT
AS 
BEGIN   
    INSERT INTO dbo.Adaptor (Col1, Col2) VALUES (@param1, @param2)
    SET @ID = SCOPE_IDENTITY(); 
END



есть запрос на ее вызов в маппинг файле

Код: xml
1.
2.
3.
4.
5.
6.
<sql-query name="insertData" callable="true">
    <return alias="adaptor" class="MyClass">
        <return-property name="id" column="ID" />
    </return>
    { ? = call InsertData(:param1, :param2) }
</sql-query>




есть объект EntityManager из которого пытаюсь собрать запрос и выполнить его

Код: java
1.
2.
3.
4.
5.
6.
Query query = entityManager.createNamedQuery("insertData");

            query.setParameter("param1", object);
            query.setParameter("param2", getName());
            // TODO try to use getSingleResult in tests
            List result = query.getResultList();



если запустить в таком виде, то получаю,

exception java.sql.SQLException: Parameter #3 has not been set

если убрать ? = , то получаю java.sql.SQLException: Procedure or function 'insertData' expects parameter '@ID', which was not supplied.


Если кто-то сталкивался с похожей ситуацией когда нужно получить возвращаемое значение из хранимой процеду MS SQL Server и в качестве ORM используется Hibernate, помогите плиз.
...
Рейтинг: 0 / 0
17.06.2013, 13:30:00
    #38299893
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
futurologx,
именно хибер нужен? Или курсовая?
Т.к. хибер для получения объектов, а не обчного числа результата (JDBC)
...
Рейтинг: 0 / 0
17.06.2013, 15:19:14
    #38300191
futurologx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Да, хибернейт. Это число является полем объекта который есть в хибернейт мапинге.
...
Рейтинг: 0 / 0
17.06.2013, 15:39:36
    #38300225
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
futurologxЕсли кто-то сталкивался с похожей ситуацией когда нужно получить возвращаемое значение из
http://www.sql.ru/forum/afsearch.aspx?s=registerOutParameter&submit=?????&bid=38
...
Рейтинг: 0 / 0
17.06.2013, 19:04:17
    #38300578
futurologx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Petro123,

по ссылке нет похожих проблем
...
Рейтинг: 0 / 0
17.06.2013, 22:32:18
    #38300743
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
futurologx,

Код: java
1.
2.
3.
4.
5.
CallableStatement cstmt = conn.prepareCall("{? = CALL balance(?)}");
cstmt.registerOutParaeter(1, Types.FLOAT);
cstmt.setInt(2, acctNo);
cstmt.executeUpdate();
float acctBal = cstmt.getFloat(1);
...
Рейтинг: 0 / 0
18.06.2013, 11:57:30
    #38301266
futurologx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Petro123futurologx,

Код: java
1.
2.
3.
4.
5.
CallableStatement cstmt = conn.prepareCall("{? = CALL balance(?)}");
cstmt.registerOutParaeter(1, Types.FLOAT);
cstmt.setInt(2, acctNo);
cstmt.executeUpdate();
float acctBal = cstmt.getFloat(1);



К сожаленю, я ограничен использованием EntityManager. Для создания CallableStatement нужен DataSource из которого можно получить Connection. Это более низкий уровень чем Hibernate.

Нашел инфу что до версии 4.2 в хибернейте вызов хранимых процедур весьма ограничен. Найти как вернуть сгенеренное в процедуре поле как результат процедуры я особо нигде не нашелю Возможно хибернейт этого не умеет в случае с MS SQL Server. Но надеюсь я ошибаюсь
...
Рейтинг: 0 / 0
18.06.2013, 13:09:05
    #38301453
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
futurologxЭто более низкий уровень чем Hibernate.
получить ID вставленной записи в БД через ХП - это тоже низкий уровень.
Обычно это не требуется.
Удачи!
...
Рейтинг: 0 / 0
18.06.2013, 15:51:57
    #38301846
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Код: sql
1.
2.
    @Resource(name = "server_con")
    private DataSource ds;


А так нельзя ли?
Вообще, в EclipseLink можно было получить из EntityManager Connection. А в Hibernate я не пробовал.
...
Рейтинг: 0 / 0
18.06.2013, 16:20:04
    #38301904
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Niky4000,
покажи тот код КУДА понадобился результат хранимки.
...
Рейтинг: 0 / 0
18.06.2013, 16:34:50
    #38301935
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Там формирование XMLв хранимой процедуре и выгрузка в файл.
...
Рейтинг: 0 / 0
18.06.2013, 17:32:29
    #38302031
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Niky4000Там формирование XMLв хранимой процедуре и выгрузка в файл.
не надоело чернила экономить?
Выгрузка в файл - это OUTPUT = файл = строка?
Где?
...
Рейтинг: 0 / 0
19.06.2013, 09:26:08
    #38302622
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
Чего?
Код конкретной реализации?

Код: sql
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.
55.
56.
57.
                        ArrayList<HashMap<String, Object>> ret =
                                (ArrayList<HashMap<String, Object>>) storedFunctionCaller.exec_sql_proc(
                                new ExecParameters(
                                new FunctionToCall("xml_handler.make_xml_from_constant_tables"),
                                new InputParameters(new Object[]{UserId, unloadTask.getSluch().getSluchPK().getIdPak(), 0}),
                                new InputParametersTypes(new Class[]{Integer.class, String.class, Integer.class}),
                                new OutputParameters(new String[]{"id", "id_schet", "xml_text"}),
                                new OutputParametersTypes(new Class[]{java.lang.Integer.class, java.lang.String.class, java.lang.String.class}),
                                new FunctionOutputType(OracleTypes.CURSOR)), null);


                        //makeFile();
                        //System.out.println("Task finished: " + unloadTask.getId().toString() + " Package: " + unloadTask.getSluch().getSchet().getIdPak() + " " + new SimpleDateFormat("dd.MM.yyyy HH.mm.ss").format(new Date()));
                        talkTaskFinished(ret,unloadTask.getSluch().getSluchPK().getIdPak(),0,null);
...
...
...
...

    private void talkTaskFinished(ArrayList<HashMap<String, Object>> ret, String idPak, int i, String forceIdPakSizeString) {
        String sss;
        if (forceIdPakSizeString==null){
            sss="";
            }else{
        sss= " " + new SimpleDateFormat("dd.MM.yyyy HH.mm.ss").format(new Date()) + " " + (i + 1) + " of " + forceIdPakSizeString;
       
        
        }
       if (ret.size() > 0) {
            for (HashMap<String, Object> r : ret) {
                if ((String) r.get("id_schet") != null) {
                    makeFile((String) r.get("id_schet"), (String) r.get("xml_text"));
                    System.out.println("Task finished forced! Package: " + idPak + " --> " + (String) r.get("id_schet") + sss);
                } else {
                    System.out.println("Task FAILED forced! Package: " + idPak + sss);
                }
            }
        } else {
            System.out.println("Nothing to unload! Package: " + idPak + sss);
        }
    }
...
...
...
    private void makeFile(String idSchet, String xml) {

        if (xml == null || xml.length() == 0) {
            System.out.println("Package has no Incidents for unload!");
        } else {
            if (true) { // Код рабочий, но будем считать суммы по Сгибневскому алгоритму!
                String crc32 = calculateCRC32(xml.substring(xml.lastIndexOf("<SCHET>"), xml.lastIndexOf("</SCHET>") + new String("</SCHET>").length()));
                xml = xml.replace("<CRC32>0</CRC32>", "<CRC32>" + crc32 + "</CRC32>");
            }
            ah.process_unload(idSchet, xml);
        }

    }
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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