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


115

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

Javadoc和JPA规范什么也没说。


我正是在搜索这个问题!!最多4个您!
rafa.ferreira

Answers:


69

你是对的。JPA规范对此一无所获。但是《Java Persistence with Hibernate》第二版书说:

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

调用query.getResultList()时,没有结果的Hibernate JPA实现(实体管理器)返回null。

更新

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

当找不到结果时,Eclipselink中也会返回一个空列表。


29
这当然已经过时了,Hibernate返回一个空列表。
Michael Laffargue 2013年

2
我仍然从Hibernate 4.3.10(作为Spring Data的JPA引擎运行)获得null。这仅会发生在单个本机查询中,因为典型的JPA查询会按预期工作。
Jacek Prucia

1
只需使用OR检查两个条件即可。if(rows == null || rows.size == 0){}其中的行是getResultList()返回的内容
Number945,17年

只需将其包装在Optional.ofNullable()中即可。
de.la.ru

我认为,返回null而不是空列表不是规范所要的,否则将很清楚何时null在其他地方期望。特别是作为getResultList阅读文档Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the resultsnull当然,我仍然会检查并在需要时自己返回一个空列表。
勒内

23

如果规格说不可能发生,您会相信它们吗?假设您的代码可以针对不同的JPA实现而运行,您是否相信每个实现者都能正确实现它?

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

现在有个大问题:我们应该将“ null”和一个空List视为同义词吗?这是规范应该为我们提供帮助的地方,而没有帮助。

我的猜测是,空返回(如果确实会发生)将等同于“我不理解查询”,而空列表将是“是,理解查询,但没有记录”。

您可能有一个处理不可解析查询的代码路径(可能是异常),我倾向于将null返回指向该路径。


+1说的很对:“您会信任每个JPA提供者吗?” NO :)
dfa

编辑添加:亚瑟(Arthur)指出,如果未找到任何记录,则Hibernate的JPA实际上返回null。因此,实际上,在这种情况下,我们确实需要将空列表和空列表折叠在一起。我认为我们上面经过的思考过程仍然有效。甚至可以想象,对于不同的JPA堆栈,我们应该对null进行不同的处理。欢迎携带方便。
djna

同意 由于JPA规范没有做应做的事情,因此仅存在“可移植性乐趣”……指定了精确的语义。可耻的是,它是由既得利益的委员会管理的。
DataNucleus

2
“我不明白查询”应该被处理Exception,返回null这里Collection是返回类型是一个明显的设计缺陷
matoni

13

与亚瑟(Arthur)的帖子相反,当我实际运行一个没有匹配实体的查询时,我得到一个空列表,而不是null。这是使用Hibernate的方式,也是我认为正确的方式:如果您要求实体集合,而没有任何实体,则空列表是正确的答案。


2
对于OpenJPA,我还会得到一个空列表,而不是null。
Gnavvy 2011年

3

如果仔细查看org.hibernate.loader.Loader(4.1),您会发现列表始终在processResultSet()方法(docsource)中初始化。

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

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

}

因此,我认为它现在不会返回null。


2
为确切的代码段欢呼。但是这个答案只针对休眠状态,这是规范的实现之一。其他实现(如OpenJPA)在行为上有所不同。另外,休眠似乎已经改变了不同版本的行为。
venky

1

当然,如果使用Jakarta的CollectionUtils.isNotEmpty测试结果集,则无论哪种方法都可以解决。



0

给定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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.