如果是这样,在什么情况下?
Javadoc 和 JPA 规范什么都没说。
如果说明书上说不可能,你会相信吗?假设您的代码可以运行在可能不同的 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 ()方法(医生,来源)中初始化。
org.hibernate.loader.Loader
protected List processResultSet(...) throws SQLException { final List results = new ArrayList(); handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session ); ... return results; }
所以我认为它现在不会返回 null。
Query.getResultList()返回一个空列表,而不是 null。因此,在返回的结果中检查 isEmpty(),如果它为 false,则继续执行其余的逻辑。
Query.getResultList()
null
isEmpty()
考虑到 getResultsList()在 org.hibernate.ejb.QueryImpl类中的实现,返回一个 null是可能的:
getResultsList()
org.hibernate.ejb.QueryImpl
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