Answers:
你是对的。JPA规范对此一无所获。但是《Java Persistence with Hibernate》第二版书说:
如果查询结果为空,则返回null
调用query.getResultList()时,没有结果的Hibernate JPA实现(实体管理器)返回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”和一个空List视为同义词吗?这是规范应该为我们提供帮助的地方,而没有帮助。
我的猜测是,空返回(如果确实会发生)将等同于“我不理解查询”,而空列表将是“是,理解查询,但没有记录”。
您可能有一个处理不可解析查询的代码路径(可能是异常),我倾向于将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。
Query.getResultList()
返回一个空列表,而不是null
。因此,请检查isEmpty()
返回的结果,如果结果为假,则继续其余逻辑。
给定getResultsList()
in 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