能否返回 null?

如果是这样,在什么情况下?

Javadoc 和 JPA 规范什么都没说。

75224 次浏览

如果说明书上说不可能,你会相信吗?假设您的代码可以运行在可能不同的 JPA 实现上,您是否相信每个实现都能正确运行?

无论如何,我都会进行防御性编码,并检查是否为 null。

现在最大的问题是: 我们是否应该把“ null”和一个空 List 看作同义词?这就是说明书应该帮助我们的地方,而不是。

我的猜测是,null 返回(如果确实可能发生的话)将等同于“ I didn’t understand the query”,而空列表将等同于“ yes,understand the query,but there was no record”。

您可能有一个处理无法解析的查询的代码路径(可能是一个异常) ,我倾向于沿着该路径直接返回 null。

你是对的。 JPA 规范没有提到它。但是 Java 持久性与 Hibernate 书,第2版说:

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

Hibernate JPA 实现(Entity Manager)在调用 query.getResultList ()时返回 null,但没有结果。

更新

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

如果没有找到结果,Eclipselink 也会返回空列表。

与 Arthur 的文章相反,当我实际运行一个没有实体匹配的查询时,我得到的是一个空列表,而不是 null。这是在使用 Hibernate,我认为这是正确的行为: 当您请求一个实体集合但没有实体集合时,空列表是正确的答案。

当然,如果使用 Jakarta’s CollectionUtils.isNotEmpty 测试结果集,那么两种方法都可以。

如果仔细查看 org.hibernate.loader.Loader(4.1) ,您会发现列表总是在 processResultSet ()方法(医生来源)中初始化。

protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();


handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;


}

所以我认为它现在不会返回 null。

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;
}

我的冬眠版本是: 3.3.1.GA