Respostas:
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.
if(rows == null || rows.size == 0){}
onde linhas é o que getResultList () retorna
null
vez de uma lista vazia não é o que se pretende com a especificação, pois, de outra forma, torna-se bastante claro quando esperar null
em outros lugares. Especialmente como a documentação para getResultList
leituras Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Eu ainda verificaria null
e retornaria uma lista vazia, se necessário.
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.
Exception
, retornar null
onde Collection
está no tipo de retorno é uma falha de design óbvia
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.
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.
Claro, se você testar o conjunto de resultados com CollectionUtils.isNotEmpty de Jakarta, estará coberto de qualquer maneira.
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.
Dada a implementação de getResultsList()
em org.hibernate.ejb.QueryImpl
classe, é 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