답변:
당신이 옳습니다. JPA 사양은 그것에 대해 아무것도 말하지 않습니다. 그러나 Java Persistence with Hibernate book, 2nd edition 은 다음과 같이 말합니다.
쿼리 결과가 비어 있으면 null이 반환됩니다.
Hibernate JPA 구현 (Entity Manager)은 결과없이 query.getResultList ()를 호출 할 때 null을 반환합니다.
최신 정보
일부 사용자가 지적했듯이 최신 버전의 Hibernate는 대신 빈 목록을 반환하는 것 같습니다.
결과를 찾을 수없는 경우에도 Eclipselink에 빈 목록이 반환됩니다.
if(rows == null || rows.size == 0){}
행은 getResultList ()가 반환하는 것입니다.
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
물론 확인하고 필요한 경우 빈 목록을 직접 반환합니다.
사양에있을 수 없다고한다면 믿으시겠습니까? 코드가 다른 JPA 구현에 대해 실행될 수 있다는 점을 감안할 때 모든 구현자가 올바르게 작동한다고 믿으시겠습니까?
어쨌든 방어 적으로 코딩하고 null을 확인합니다.
이제 큰 질문 : "null"과 빈 목록을 동의어로 취급해야합니까? 이것은 사양이 우리에게 도움이되어야하고 그렇지 않은 곳입니다.
내 생각에 null 반환 (실제로 발생할 수있는 경우)은 "질의를 이해하지 못했습니다."와 같고 빈 목록은 "예, 쿼리를 이해했지만 레코드가 없었습니다."라는 것입니다.
구문 분석 할 수없는 쿼리를 처리하는 코드 경로 (예외 일 가능성이 높음)가있을 수 있으며 해당 경로로 null 반환을 지시하는 경향이 있습니다.
Exception
반환 null
곳 Collection
반환 형식에 것은 명백한 설계 결함이다
Arthur의 게시물과 달리 실제로 일치하는 항목이없는 쿼리를 실행했을 때 null이 아닌 빈 목록이 표시되었습니다. 이것은 Hibernate를 사용하고 있으며 올바른 행동이라고 생각하는 것입니다. 빈 목록은 엔티티 모음을 요청하고 아무것도 없을 때 정답입니다.
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을 반환하지 않을 것이라고 생각합니다.
getResultsList()
in org.hibernate.ejb.QueryImpl
class 구현이 주어지면 다음 을 반환 할 수 있습니다 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