javax.persistence.Query.getResultList ()가 null을 반환 할 수 있습니까?


115

그렇다면 어떤 상황에서?

Javadoc 및 JPA 사양에는 아무 것도 없습니다.


나는 정확히이 질문을 찾고 있었다! tks! 최대 4 명!
rafa.ferreira 2010 년

답변:


69

당신이 옳습니다. JPA 사양은 그것에 대해 아무것도 말하지 않습니다. 그러나 Java Persistence with Hibernate book, 2nd edition 은 다음과 같이 말합니다.

쿼리 결과가 비어 있으면 null이 반환됩니다.

Hibernate JPA 구현 (Entity Manager)은 결과없이 query.getResultList ()를 호출 할 때 null을 반환합니다.

최신 정보

일부 사용자가 지적했듯이 최신 버전의 Hibernate는 대신 빈 목록을 반환하는 것 같습니다.

결과를 찾을 수없는 경우에도 Eclipselink에 빈 목록이 반환됩니다.


29
이것은 확실히 구식이며 Hibernate는 빈 목록을 반환합니다.
Michael Laffargue 2013-06-17

2
Hibernate 4.3.10 (SpringData 용 JPA 엔진으로 실행)에서 여전히 null을 얻습니다. 이는 일반적인 JPA 쿼리가 예상대로 작동하므로 단일 기본 쿼리에 대해서만 발생합니다.
Jacek Prucia

1
OR를 사용하여 두 조건을 모두 확인하십시오. if(rows == null || rows.size == 0){}행은 getResultList ()가 반환하는 것입니다.
Number945

Optional.ofNullable ()로 감싸면 설정이 완료됩니다.
de.la.ru

null빈 목록 대신 반환 하는 것이 사양에서 의도 한 것이 아니라고 생각합니다. 그렇지 않으면 null다른 곳에서 예상 할 때를 매우 명확하게 보여줍니다 . 특히 getResultList읽기에 대한 문서로 Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. null물론 확인하고 필요한 경우 빈 목록을 직접 반환합니다.
René

23

사양에있을 수 없다고한다면 믿으시겠습니까? 코드가 다른 JPA 구현에 대해 실행될 수 있다는 점을 감안할 때 모든 구현자가 올바르게 작동한다고 믿으시겠습니까?

어쨌든 방어 적으로 코딩하고 null을 확인합니다.

이제 큰 질문 : "null"과 빈 목록을 동의어로 취급해야합니까? 이것은 사양이 우리에게 도움이되어야하고 그렇지 않은 곳입니다.

내 생각에 null 반환 (실제로 발생할 수있는 경우)은 "질의를 이해하지 못했습니다."와 같고 빈 목록은 "예, 쿼리를 이해했지만 레코드가 없었습니다."라는 것입니다.

구문 분석 할 수없는 쿼리를 처리하는 코드 경로 (예외 일 가능성이 높음)가있을 수 있으며 해당 경로로 null 반환을 지시하는 경향이 있습니다.


+1 "모든 JPA 제공 업체를 믿으시겠습니까?" NO :)
dfa

추가하기 위해 편집 됨 : Arthur는 Hibernate의 JPA가 실제로 레코드가 없으면 null을 반환한다고 지적했습니다. 따라서 실제로이 경우에는 null과 빈 목록을 함께 접을 필요가 있습니다. 나는 우리가 위에서 겪은 사고 과정이 여전히 유효하다고 믿습니다. 다른 JPA 스택에 대해 다른 null 처리를해야한다는 것도 생각할 수 있습니다. 휴대 성 재미에 오신 것을 환영합니다.
djna

동의합니다. JPA 사양이 수행해야하는 작업을 수행하지 않기 때문에 "이동성 재미"만 존재합니다. 정확한 의미를 지정합니다. 부끄러움은 기득권을 가진위원회에 의해 운영됩니다.
DataNucleus

2
로 처리해야한다 "나는 쿼리 이해하지 못했다" Exception반환 nullCollection반환 형식에 것은 명백한 설계 결함이다
matoni

13

Arthur의 게시물과 달리 실제로 일치하는 항목이없는 쿼리를 실행했을 때 null이 아닌 빈 목록이 표시되었습니다. 이것은 Hibernate를 사용하고 있으며 올바른 행동이라고 생각하는 것입니다. 빈 목록은 엔티티 모음을 요청하고 아무것도 없을 때 정답입니다.


2
OpenJPA의 경우 null 대신 빈 목록이 표시됩니다.
Gnavvy 2011 년

3

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;

}

그래서 지금은 null을 반환하지 않을 것이라고 생각합니다.


2
정확한 코드 스 니펫을 응원합니다. 그러나이 답변은 사양 구현 중 하나 인 최대 절전 모드에만 중점을 둡니다. OpenJPA와 같은 다른 구현은 동작이 다릅니다. 또한 최대 절전 모드는 다른 버전에서 동작을 변경 한 것으로 보입니다.
venky

1

물론 Jakarta의 CollectionUtils.isNotEmpty로 결과 집합을 테스트하면 어느 쪽이든 다룹니다.


0

Query.getResultList()대신 빈 목록을 반환합니다 null. 따라서 isEmpty()반환 된 결과를 확인 하고 거짓이면 나머지 논리를 계속합니다.


0

getResultsList()in org.hibernate.ejb.QueryImplclass 구현이 주어지면 다음 을 반환 할 수 있습니다 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.