Javax.persistence.Query.getResultList () pode retornar nulo?

115

E em caso afirmativo, em que circunstâncias?

As especificações de Javadoc e JPA não dizem nada.

rdk
fonte
Eu estava pesquisando exatamente essa questão! tks! até 4 você!
rafa.ferreira

Respostas:

69

Você está certo. A especificação JPA não diz nada sobre isso. Mas o livro Java Persistence with Hibernate, 2ª edição , diz:

Se o resultado da consulta estiver vazio, um nulo será retornado

A implementação do Hibernate JPA (Entity Manager) retorna null quando você chama query.getResultList () sem nenhum resultado.

ATUALIZAR

Como apontado por alguns usuários, parece que uma versão mais recente do Hibernate retorna uma lista vazia.

Uma lista vazia também é retornada no Eclipselink quando nenhum resultado é encontrado.

Arthur Ronald
fonte
29
Isso certamente está desatualizado, o Hibernate retorna uma lista vazia.
Michael Laffargue
2
Eu ainda recebo null do Hibernate 4.3.10 (executando como mecanismo JPA para Spring Data). Isso acontece apenas para uma única consulta nativa, pois as consultas JPA típicas funcionam conforme o esperado.
Jacek Prucia
1
Basta verificar as duas condições usando OU. if(rows == null || rows.size == 0){}onde linhas é o que getResultList () retorna
Número945
Basta envolvê-lo em um Optional.ofNullable () e pronto.
de.la.ru
Eu acredito que retornar em nullvez de uma lista vazia não é o que se pretende com a especificação, pois, de outra forma, torna-se bastante claro quando esperar nullem outros lugares. Especialmente como a documentação para getResultListleituras Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. Eu ainda verificaria nulle retornaria uma lista vazia, se necessário.
René
23

Se as especificações dissessem que isso não poderia acontecer, você acreditaria nelas? Considerando que seu código pode ser executado em várias implementações de JPA diferentes, você confiaria em cada implementador para acertar?

Não importa o que aconteça, eu iria codificar defensivamente e verificar se há nulo.

Agora, a grande questão: devemos tratar "nulo" e uma Lista vazia como sinônimos? É aqui que as especificações devem nos ajudar, e não ajudam.

Meu palpite é que um retorno nulo (se de fato poderia acontecer) seria equivalente a "Não entendi a consulta" e a lista vazia seria "sim, entendi a consulta, mas não houve registros".

Você talvez tenha um caminho de código (provavelmente uma exceção) que lida com consultas não analisáveis, eu tenderia a direcionar um retorno nulo por esse caminho.

djna
fonte
+1 você está certo ao dizer: "você confiaria em todos os provedores de JPA?" NÃO :)
dfa
Editado para adicionar: Arthur apontou que o JPA do Hibernate de fato retorna nulo se nenhum registro for encontrado. Então, de fato, neste caso, precisamos juntar as listas nula e vazia. Eu acredito que o processo de pensamento pelo qual passamos acima ainda é válido. É até concebível que devamos ter diferentes tratamentos de nulos para diferentes pilhas JPA. Bem-vindo à diversão com portabilidade.
djna
Acordado. Só existe "diversão de portabilidade" devido à especificação JPA não fazer o que deveria ... especificar a semântica precisa. É uma pena que seja administrado por um comitê com interesses adquiridos.
DataNucleus
2
"Não entendi a consulta" deve ser tratada como Exception, retornar nullonde Collectionestá no tipo de retorno é uma falha de design óbvia
matoni
13

Ao contrário da postagem de Arthur, quando eu realmente executei uma consulta que nenhuma entidade correspondeu, obtive uma lista vazia, não nula. Isso é usar o Hibernate e é o que considero um comportamento correto: uma lista vazia é a resposta correta quando você pede uma coleção de entidades e não há nenhuma.

Andrew Simons
fonte
2
para OpenJPA, também recebo uma lista vazia em vez de nula.
Gnavvy
3

Se você der uma olhada em org.hibernate.loader.Loader(4.1), verá que a lista é sempre inicializada dentro do método processResultSet () ( doc , source ).

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

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

}

Portanto, não acho que ele retornará null agora.

Charles Follet
fonte
2
Saudações pelo trecho de código exato. Mas essa resposta se concentra apenas em hibernar, que é uma das implementações da especificação. Outras implementações como OpenJPA diferem no comportamento. Além disso, a hibernação parece ter alterado o comportamento nas diferentes versões.
venky
1

Claro, se você testar o conjunto de resultados com CollectionUtils.isNotEmpty de Jakarta, estará coberto de qualquer maneira.

Al Scherer
fonte
0

Query.getResultList()retorna uma lista vazia em vez de null. Portanto, verifique isEmpty()o resultado retornado e continue com o resto da lógica se for falso.

Cyril Sojan
fonte
0

Dada a implementação de getResultsList()em org.hibernate.ejb.QueryImplclasse, é possível retornar um 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;
    }

Minha versão de hibernação é: 3.3.1.GA

wile o coiote
fonte