javax.persistence.Query.getResultList()是否可以返回null?

如果是的话,在什么情况下?

Javadoc和JPA规范什么也没说。

你是对的。 JPA规范没有说到这一点。 但Java持久与Hibernate的书,第二版说:

如果查询结果为空,则返回null

当您调用query.getResultList()而没有结果时,Hibernate JPA实现(实体pipe理器)将返回null。

UPDATE

正如一些用户指出的那样,Hibernate的最新版本似乎返回一个空列表。

如果说规格说不能发生,你会相信吗? 考虑到你的代码可能会运行在不同的JPA实现上,你会相信每个实现者都能正确实现吗?

不pipe怎样,我都会在防守方面进行编码并检查是否为null。

现在最大的问题是:我们应该把“空”和空列作为同义词吗? 这是规格应该帮助我们的地方,而不是。

我的猜测是,一个空返回(如果确实可能发生)将等于“我不明白查询”,空列表将是“是的,了解查询,但没有logging”。

你可能有一个代码path(可能是一个例外),处理不可分析的查询,我倾向于指向一个空的返回下来的path。

与亚瑟的post相反,当我真的跑了一个没有实体匹配的查询时,我得到了一个空列表,而不是null。 这是使用hibernate,我认为是正确的行为:当你要求一个实体的集合,没有任何空列表是正确的答案。

当然,如果你用雅加达的CollectionUtils.isNotEmptytesting结果集,那么你可以用任何方式来覆盖。

如果仔细看看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。