Процедура хранения вызовов Jpa, не удалось преобразовать метки времени в ref_cursor - PullRequest
0 голосов
/ 27 июня 2018

На данный момент наш проект использует JPA для вызова хранимой процедуры, подобной этой:

  StoredProcedureQuery query = em.createStoredProcedureQuery("Package.Procedure")
            .registerStoredProcedureParameter(1, Long.class, ParameterMode.IN)
            .registerStoredProcedureParameter(2, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(3, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(4, Long.class, ParameterMode.IN)
            .registerStoredProcedureParameter(5, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(6, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(7, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(8, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(9, Long.class, ParameterMode.IN)
            .registerStoredProcedureParameter(10, Class.class, ParameterMode.REF_CURSOR)
            .setParameter(1, null)
            .setParameter(2, null)
            .setParameter(3, null)
            .setParameter(4, null)
            .setParameter(5, null)
            .setParameter(6, null)
            .setParameter(7, null)
            .setParameter(8, null)
            .setParameter(9, null);
    List<Object[]> result = query.getResultList();

Выходные данные представляют собой таблицу, в которой есть 2 столбца отметки времени.

Когда я пытаюсь запустить этот код, мы получаем исключение:

Причина: org.hibernate.MappingException: Нет сопоставления диалектов для типа JDBC: -101

Когда я ищу, -101 означает, что результат содержит метки времени и не может его преобразовать, я думаю. Мы пытаемся удалить столбец с двумя временными метками из процедуры, и все работает.

Я пытаюсь найти решение, и большинство ответов говорят мне о приведении значения перед возвратом или "addScalar". Но тот, кто создает эту процедуру, не хочет ее обновлять и просит нас найти решение для нее.

Так может ли кто-нибудь сказать мне, что мне делать в этом случае?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

После дополнительных исследований я нашел эту страницу

Мне нужно создать свой собственный настраиваемый диалект Oracle и зарегистрировать для него тип -101.

public class MyOracleDialect extends Oracle10gDialect {

    public MyOracleDialect() {
        super();
        registerHibernateType(-101, DateType.INSTANCE.getName());
    }
}

Так как тип -101 не был найден в классе Types, я должен использовать здесь номер исправления.

После этого я изменяю свою конфигурацию "hibernate.dialect" на этот класс.

Все работает сейчас.

0 голосов
/ 27 июня 2018

если я правильно вас понял, у вас есть ошибка в преобразовании метки времени. все даты Java, такие как java.util.Date или java.sql.Date, работают с большим числом и вы можете получить это длинное число из вашей метки времени и использовать его для преобразования в вашу Java дату

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...