developer tip

javax.persistence.Query.getResultList ()가 널을 리턴 할 수 있습니까?

optionbox 2020. 7. 29. 08:09
반응형

javax.persistence.Query.getResultList ()가 널을 리턴 할 수 있습니까?


그렇다면 어떤 상황에서?

Javadoc 및 JPA 사양은 아무 것도 말하지 않습니다.


네 말이 맞아 JPA 사양은 그것에 대해 아무 말도하지 않습니다. 그러나 Hibernate book, 2 판의 Java Persistence 는 다음과 같이 말합니다.

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

결과없이 query.getResultList ()를 호출하면 최대 절전 모드 JPA 구현 (Entity Manager)에서 null을 반환합니다.

최신 정보

일부 사용자가 지적한 것처럼 최신 버전의 Hibernate는 대신 빈 목록을 반환합니다.

결과가 없으면 Eclipselink에서 빈 목록이 리턴됩니다.


사양이 일어날 수 없다고 말했다면, 당신은 그것들을 믿겠습니까? 코드가 다른 JPA 구현에 대해 아마도 실행될 수 있다고 가정하면 모든 구현자가 올바른 코드를 얻는 것을 신뢰합니까?

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

이제 큰 질문 : "널"과 빈 목록을 동의어로 취급해야합니까? 이것은 사양이 우리를 도와야하는 곳이며 그렇지 않습니다.

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

구문 분석 할 수없는 쿼리를 처리하는 코드 경로 (예외는 예외)가있을 수 있습니다. 해당 경로로 널 리턴을 지시하는 경향이 있습니다.


Arthur의 게시물과 달리 실제로 일치하는 항목이없는 쿼리를 실행하면 null이 아닌 빈 목록이 나타납니다. 이것은 최대 절전 모드를 사용하고 있으며 올바른 행동으로 간주됩니다. 빈 목록은 엔티티 컬렉션을 요청할 때 정답입니다.


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을 반환한다고 생각하지 않습니다.


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


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


의 구현을 감안할 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입니다.

참고 URL : https://stackoverflow.com/questions/1115480/can-javax-persistence-query-getresultlist-return-null

반응형