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

Код: 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
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38299893
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
futurologx,
именно хибер нужен? Или курсовая?
Т.к. хибер для получения объектов, а не обчного числа результата (JDBC)
...
Рейтинг: 0 / 0
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38300191
futurologx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, хибернейт. Это число является полем объекта который есть в хибернейт мапинге.
...
Рейтинг: 0 / 0
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38300225
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
futurologxЕсли кто-то сталкивался с похожей ситуацией когда нужно получить возвращаемое значение из
http://www.sql.ru/forum/afsearch.aspx?s=registerOutParameter&submit=?????&bid=38
...
Рейтинг: 0 / 0
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38300578
futurologx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

по ссылке нет похожих проблем
...
Рейтинг: 0 / 0
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38300743
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38301266
futurologx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38301453
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
futurologxЭто более низкий уровень чем Hibernate.
получить ID вставленной записи в БД через ХП - это тоже низкий уровень.
Обычно это не требуется.
Удачи!
...
Рейтинг: 0 / 0
Как запустить хранимую процедуру MS SQL Server из Java при помощи hibernate?
    #38301846
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
    @Resource(name = "server_con")
    private DataSource ds;


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

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


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