JPA Возвращает нуль, когда query.getSingleResult () возвращается напрямую - PullRequest
3 голосов
/ 07 февраля 2012

У меня очень странная проблема с hibernate и jpa. Ниже приведены два блока кода:

public Object getObject(Date date) {
    try {

        Query query = entityManager
                .createQuery(
                        "select ob from Object ob where date= :date");
        query.setParameter("date", date);

        return (Object)query.getSingleResult();

    } catch (EmptyResultDataAccessException e) {
        logger.debug(String.format("No Result found - date[%s]",date));
        return null;
    }
}

...

public Object getObject(Date date) {
    try {

        Query query = entityManager
                .createQuery(
                        "select ob from Object ob where date= :date");
        query.setParameter("date", date);

        Object ret = (Object)query.getSingleResult();
        return ret;


    } catch (EmptyResultDataAccessException e) {
        logger.debug(String.format("No Result found - date[%s]",date));
        return null;
    }
}

Первый генерирует исключение EmptyResultDataAccessException каждый раз, даже учитывая допустимую запись, в которой совпадает дата. Вторая возвращает результат, как и ожидалось. Кто-нибудь сталкивался с этим? Что вызывает такое поведение?

Пожалуйста, предположите, что присутствуют все другие синтаксические вещи (транзакция, инициализированный менеджер сущностей и т. Д.), Единственное, что я изменяю, это то, получаются ли результаты запроса непосредственно в возврате или сначала присваиваются переменной.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Это IS возможно, я сталкивался с этим и раньше.Я думаю, что это как-то связано с манипуляциями с байт-кодом, которые делает Hibernate.Чтобы понять суть, вам нужно перейти на очень глубокий и темный уровень реализации.

При работе с Hibernate / JPA я всегда использую второй шаблон.К сожалению, это делает код немного более многословным, но не стоит погружаться в глубину сгенерированного байтового кода и пытаться его понять.

0 голосов
/ 07 февраля 2012

Это невозможно. Два варианта эквивалентны. Возможно, вам чего-то не хватает.

Обратите внимание, что getSingleResult() может выдать исключение, если результат более 1.

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