Может ли javax.persistence.Query.getResultList () вернуть ноль? - PullRequest
108 голосов
/ 12 июля 2009

И если да, то при каких обстоятельствах?

Спецификация Javadoc и JPA ничего не говорит.

Ответы [ 7 ]

67 голосов
/ 12 июля 2009

Вы правы. Спецификация JPA ничего не говорит об этом. Но Сохранение Java с книгой Hibernate, 2-е издание , гласит:

Если результат запроса пуст, возвращается ноль

Реализация Hibernate JPA (Entity Manager) возвращает null при вызове query.getResultList () без результата.

UPDATE

Как отмечают некоторые пользователи, похоже, что новейшая версия Hibernate возвращает пустой список.

Пустой список возвращается и в Eclipselink, если результаты не найдены.

21 голосов
/ 12 июля 2009

Если бы в спецификациях говорилось, что это не может произойти, поверите ли вы им? Учитывая, что ваш код может работать против разных реализаций JPA, вы бы поверили каждому разработчику, чтобы все было правильно?

Не смотря ни на что, я буду защищаться и проверять наличие нуля.

Теперь главный вопрос: должны ли мы рассматривать «ноль» и пустой список как синонимы? Именно здесь спецификации должны помочь нам, а не помогать.

Я предполагаю, что нулевое возвращение (если оно действительно может произойти) будет эквивалентно «я не понял запрос», а пустой список будет «да, понял запрос, но записей не было».

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

13 голосов
/ 30 ноября 2009

Вопреки сообщению Артура, когда я фактически выполнил запрос, который не соответствовал ни одной сущности, я получил пустой список, а не ноль. Это использует Hibernate и я считаю, что это правильное поведение: пустой список - это правильный ответ, когда вы запрашиваете набор сущностей, а их нет.

3 голосов
/ 12 мая 2016

Если вы внимательно посмотрите на org.hibernate.loader.Loader (4.1), вы увидите, что список всегда инициализируется внутри метода processResultSet () ( doc , source ).

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

Так что я не думаю, что теперь он вернет ноль.

1 голос
/ 09 января 2010

Конечно, если вы тестируете набор результатов с помощью Джакарты CollectionUtils.isNotEmpty, вы попадаете в любую сторону.

0 голосов
/ 22 апреля 2019

Учитывая реализацию getResultsList() в org.hibernate.ejb.QueryImpl классе, можно вернуть null:

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

Моя спящая версия: 3.3.1.GA

0 голосов
/ 14 марта 2019

Query.getResultList() возвращает пустой список вместо null. Так что проверьте isEmpty() в возвращенном результате и продолжайте с остальной логикой, если оно ложно.

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