Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Hibernate и функции  [new]
Viollin
Member

Откуда:
Сообщений: 6
Есть функция, которая имеет один входной и один выходной параметры. Я нашла в интернете, как можно вызвать функцию с входными параметрами через NativeQuery (Например, https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/)

Но у меня есть еще и выходной параметр. Насколько я понимаю, в этом случае можно попробовать обойтись чистым jdbc (получить через сессию коннект и работать с ним)
Но, возможно, есть еще какие-то варианты?
23 июл 19, 00:09    [21932227]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
Viollin
...Я нашла в интернете...
https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/)
...
Но у меня есть еще и выходной параметр...

Вроде и зрение у меня плохое и очки до сих пор не купил, но смотрю в браузер по Вашей же ссылке и вижу
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter(
    1,
    Long.class,
    ParameterMode.IN
)
.registerStoredProcedureParameter(
    2,
    Long.class,
    ParameterMode.OUT
)
.setParameter(1, 1L);
 
query.execute();
 
Long commentCount = (Long) query.getOutputParameterValue(2);
23 июл 19, 01:41    [21932259]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Viollin
Member

Откуда:
Сообщений: 6
Leonid Kudryavtsev, это хранимая процедура. А у меня функция. Она кроме in и out имеет еще return.
Насколько я понимаю, выделенный вами код не позволяет получить возвращаемое значение. Поправьте меня, пожалуйста, если ошибаюсь
23 июл 19, 11:15    [21932456]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
Viollin
А у меня функция
дай ссыль какая база и что там за функция и почему не хранимка.
23 июл 19, 11:46    [21932501]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Viollin
Member

Откуда:
Сообщений: 6
PetroNotC Sharp, какую именно вам ссылку надо?
База оракловая.
Насколько я помню, хранимая процедура не возвращает значение (речь про return). Хранимая функция умеет возвращать значение.
Вопрос в том, что представленный код для хранимой процедуры не умеет возвращать значение. Или же я не нашла нужного метода?
23 июл 19, 12:20    [21932537]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
OK
И функции и процедуры коротко обзывают хранимками.
Теперь ждем ошибку на выше код что вам дали.
Вы пробуйте, думать будте после ошибки.
23 июл 19, 12:58    [21932585]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Viollin
Member

Откуда:
Сообщений: 6
PetroNotC Sharp
OK
И функции и процедуры коротко обзывают хранимками.
Теперь ждем ошибку на выше код что вам дали.
Вы пробуйте, думать будте после ошибки.


Не совсем понимаю, как адаптировать функцию под этот код.
Функция, соответственно {? = call func (?, ?) }

По аналогии с jdbc
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("func")
.registerStoredProcedureParameter(
    1,
    String.class,
    ParameterMode.OUT
)
.registerStoredProcedureParameter(
    2,
    Long.class,
    ParameterMode.IN
)
.registerStoredProcedureParameter(
    3,
    String.class,
    ParameterMode.OUT
)
.setParameter(2, 1L);
 
query.execute();
 
String result= (String) query.getOutputParameterValue(1);


Получаю ошибку PLS-00306 ошибочно число или типы аргументов при обращении к 'func'
23 июл 19, 14:12    [21932681]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
Viollin,
Теперь дайте заголовок хранимки - create proc....
23 июл 19, 14:27    [21932699]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
Viollin
Leonid Kudryavtsev, это хранимая процедура. А у меня функция. Она кроме in и out имеет еще return.
Насколько я понимаю, выделенный вами код не позволяет получить возвращаемое значение. Поправьте меня, пожалуйста, если ошибаюсь

Любую ф-цию можно переделать в анонимный блок
Примерно так (не проверял):
declare
  x_result number;
begin
  x_result := my_function( :param1, :param2 );
  :param3 := x_result;
end;

p.s. возможно ошибаюсь с точкой запятой после последнего end. Никогда не помнил, когда нужна точка с запятой, когда не нужна. Проще проверить оба варианта, чем в доке ковырятся ))).
23 июл 19, 14:37    [21932712]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
p.p.s.
Как минимум PL/SQL блок можно попытаться скормить в
createNativeQuery
интерфейс Query так же замечательно имеет и set и getParameter методы

p.p.p.s.
Eclipse и java на компьютере стоит, но с hibernate дел обычно не имею. Если выложите __рабочий__ и __полный__ test case проекта с вызовом какой нибудь stored procedure, то тогда смогу скомпилировать и посмотреть более предметно.
23 июл 19, 14:52    [21932744]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
поискал в гугле, сходу Hibernate примера не нашел.
https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/

Another approach is to call the database function using plain JDBC API:
CREATE OR REPLACE FUNCTION fn_count_comments (
    postId IN NUMBER )
    RETURN NUMBER
IS
    commentCount NUMBER;
BEGIN
    SELECT COUNT(*) INTO commentCount
    FROM post_comment
    WHERE post_id = postId;
    RETURN( commentCount );
END;

Session session = entityManager.unwrap( Session.class );
 
Integer commentCount = session.doReturningWork(
    connection -> {
    try (CallableStatement function = connection
        .prepareCall(
            "{ ? = call fn_count_comments(?) }" )) {
        function.registerOutParameter( 1, Types.INTEGER );
        function.setInt( 2, 1 );
        function.execute();
        return function.getInt( 1 );
    }
} );

23 июл 19, 14:58    [21932752]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Viollin
Member

Откуда:
Сообщений: 6
PetroNotC Sharp
Viollin,
Теперь дайте заголовок хранимки - create proc....


create or replace FUNCTION func(in_param IN NUMBER, out_param OUT VARCHAR2) 
   RETURN VARCHAR2
   IS result VARCHAR2(130);


Функция рабочая и нормально отрабатывает на jdbc

Leonid Kudryavtsev
поискал в гугле, сходу Hibernate примера не нашел.
https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/

Если вы обратите внимание, то ссылку на этот сайт я давала еще в самом первом посте. Как и указывала на то, что можно сделать, уйдя с hibernate на jdbc. Но вопрос был о том, можно ли избежать как раз того кода, что вы привели.
23 июл 19, 23:42    [21933177]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
Viollin
Получаю ошибку
теперь найдите пример с jpa 2.1 и сделайте его. То есть сделайте по книжке. А потом уже свой.
И стек ошибки нужна давать полный.
https://forum.hibernate.org/viewtopic.php?f=1&t=1006663&view=next
24 июл 19, 07:39    [21933208]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Viollin
Member

Откуда:
Сообщений: 6
PetroNotC Sharp
Viollin
Получаю ошибку
теперь найдите пример с jpa 2.1 и сделайте его. То есть сделайте по книжке. А потом уже свой.
И стек ошибки нужна давать полный.
https://forum.hibernate.org/viewtopic.php?f=1&t=1006663&view=next

А не могли бы вы привести пример кода для функции? Или хотя бы ссылку на такой код, потому что я примеров с функциями не нашла(
24 июл 19, 09:15    [21933229]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
Viollin,
Я дал ссыль. Там возврат класса конечно, но вы его сделайте и потом пробуете на простой тип.
24 июл 19, 09:42    [21933245]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
Viollin,

List <Reference> l = q.getResultList ();
Функция?
24 июл 19, 09:46    [21933248]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
Viollin,
Ссылок не найдете так задача странная. Хранимки и ОРМ.
24 июл 19, 09:49    [21933251]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
Viollin
Но вопрос был о том, можно ли избежать как раз того кода, что вы привели.

Теоретически, createNativeQuery вроде для этого и придумано

практически, проверять банально лень, у меня минимум часа 2-3 на проверку уйдит, под рукой никакого hibernate проекта нет
24 июл 19, 15:51    [21933671]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 339
Leonid Kudryavtsev,
100 летвОбед, а про SingleResult забыли? Мало вас в водонапорной башне учили? Там это все было.

String result = (String) entityManager.createNativeQuery(  "SELECT my_function( :param1, :param2 ) from dual")
    .setParameter("param1", 1).setParameter("param2", 1).getSingleResult();
14 авг 19, 22:19    [21949663]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
Viollin
Есть функция, которая имеет один входной и один выходной параметры. Я нашла в интернете, как можно вызвать функцию с входными параметрами через NativeQuery (Например, https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/)

Но у меня есть еще и выходной параметр. Насколько я понимаю, в этом случае можно попробовать обойтись чистым jdbc (получить через сессию коннект и работать с ним)
Но, возможно, есть еще какие-то варианты?

Я голосую за последний пункт. За чистый jdbc если он просто работает. Простой расчет. Короткий стек - просто ловить
ошибки. Длинный стек jdbc+Hibernate - больше потенциальных мест для ошибок.

Вообще хибернейт пришел из другой вселенной. Из вселенной JPA/ORM где вообще нет такого понятия как хранимая процедура.
Более того. Чистые хибернейт решения не примемлют хранимки как таковые и выкашивают их из проекта косой или топором.

Поэтому само по себе желание - странное и его надо обсуждать на самом верхнем уровне. Тоесть на уровне лиц которые
определяют дизайн и архитектуру всего проекта в целом.
15 авг 19, 11:03    [21949883]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 339
mayton
Я голосую за последний пункт. За чистый jdbc если он просто работает. Простой расчет. Короткий стек - просто ловить
ошибки. Длинный стек jdbc+Hibernate - больше потенциальных мест для ошибок.

Вообще хибернейт пришел из другой вселенной. Из вселенной JPA/ORM где вообще нет такого понятия как хранимая процедура.
Более того. Чистые хибернейт решения не примемлют хранимки как таковые и выкашивают их из проекта косой или топором.

Поэтому само по себе желание - странное и его надо обсуждать на самом верхнем уровне. Тоесть на уровне лиц которые
определяют дизайн и архитектуру всего проекта в целом.

"Все это, все верно" - как говорил т. Саахов. Хранимки не имеют прямой связи с ORM. Но тогда придется отказаться от хэша второго уровня. Вот Леонид должен помнить, как "затейники" пришивали параллельно к разработке на хибере еще чистых ораклистов, кэшем пал жертвой дури "архитекторов".
15 авг 19, 11:51    [21949946]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
В данном примере с функцией кеш 2 левела не нужен.
15 авг 19, 12:20    [21949981]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
Пылинка
к разработке на хибере еще чистых ораклистов, кэшем пал жертвой дури "архитекторов".

Кэш не пал.
Кэша там изначально не было, падать было не чему.

Ну и он бы не сильно помог. Изначальный архитектор-затейник нетрадиционной ориентации живет на Западном побережье, хибернет головного мозга во всю силу (нетрадиционной - в обычном смысле этого слова, этот факт Оракл не скрывал).

p.s.
путь данных: настройка в базе -> метаописания в Java коде -> компилятор метоописаний -> XML -> парсинг в структуры при загрузке.... JS -> JSON -> XML -> дерево в Java в структуре построенная по метаописаниям -> объекты хибера -> хибер -> Cobol -> DB

Хибер через копи-буки кидал данные в Cobol -> Cobol выдавал SQL Откуда там могли остаться рабочие кэши Хибера? )))
15 авг 19, 12:59    [21950017]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7776
Пылинка
а про SingleResult забыли?....

У автора вопроса достаточно сложный случай
Ф-ция возврашающая OUT параметры. AFAIK SELECT не пойдет как класс. только анонимный блок.

p.s.
Ну и у нас Java почти нет. Все хардкоре. Forms, PL/SQL, PHP, QT
15 авг 19, 13:03    [21950022]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate и функции  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 339
Leonid Kudryavtsev
У автора вопроса достаточно сложный случай
Ф-ция возврашающая OUT параметры. AFAIK SELECT не пойдет как класс. только анонимный блок.

Да, проспал. Я еще удивился что ты не ответил сразу.
Пусть тогда делает как все - перепаковывает в процедуру с двумя OUT
15 авг 19, 14:27    [21950127]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить