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

时间:2009-07-12 07:23:11

标签: java hibernate jpa

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

Javadoc和JPA规范什么也没说。

7 个答案:

答案 0 :(得分:67)

你是对的。 JPA规范没有提及它。但是 Java Persistence with Hibernate一书,第2版,说:

  

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

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

<强>更新

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

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

答案 1 :(得分:21)

如果规格说它不会发生,你会相信它们吗?鉴于你的代码可能会与不同的JPA实现相悖,你会相信每个实现者都能做到正确吗?

无论如何,我会采取防御措施并检查是否为空。

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

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

你可能有一个处理不可解决查询的代码路径(可能是一个例外),我倾向于在该路径上指向null返回。

答案 2 :(得分:13)

与Arthur的帖子相反,当我实际运行一个没有实体匹配的查询时,我得到一个空列表,而不是null。这是使用Hibernate并且我认为是正确的行为:当你要求一组实体并且没有任何实体时,空列表是正确的答案。

答案 3 :(得分: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。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

Query.getResultList()返回一个空列表,而不是null。因此,请检查返回的结果中的isEmpty(),如果错误则继续执行其余逻辑。

答案 6 :(得分:0)

鉴于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