如果是这样,在什么情况下呢?
Javadoc和JPA规范什么也没说。
你是对的。 JPA规范没有提及它。但Java Persistence with Hibernate一书第二版说:
如果查询结果为空,则返回null
当您调用query.getResultList()而没有结果时,Hibernate JPA实现(实体管理器)返回null。
UPDATE
正如一些用户所指出的,似乎最新版本的Hibernate会返回一个空列表。
当没有找到结果时,Eclipselink中也会返回一个空列表。
如果规格说它不会发生,你会相信它们吗?鉴于您的代码可能会与不同的JPA实现相悖,您是否相信每个实现者都能正确实现?
无论如何,我都会进行防御性编码并检查是否为null。
现在最大的问题是:我们应该将“null”和空List作为同义词吗?这是规范应该帮助我们的地方,而不是。
我的猜测是,返回null(如果确实可能发生)将等同于“我不理解查询”,空列表将是“是,理解查询,但没有记录”。
你可能有一个处理不可解决的查询的代码路径(可能是一个例外),我倾向于指向该路径的null返回。
与Arthur的帖子相反,当我实际运行一个没有实体匹配的查询时,我得到一个空列表,而不是null。这是使用Hibernate并且我认为是正确的行为:当你要求实体集合而没有任何实体时,空列表是正确的答案。
当然,如果您使用Jakarta的CollectionUtils.isNotEmpty测试结果集,则无论哪种方式都可以使用。
Query.getResultList()
返回一个空列表而不是null
。因此,请在返回的结果中检查isEmpty()
,如果为false则继续使用其余逻辑。
鉴于在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;
}
我的hibernate版本是:3.3.1.GA