javax.persistence.Query.getResultList()能否返回null?

javax.persistence.Query.getResultList()能否返回null?,java,hibernate,jpa,Java,Hibernate,Jpa,如果是,在什么情况下 Javadoc和JPA规范什么也没说 如果说明书上说不可能,你会相信吗?考虑到您的代码可以在不同的JPA实现上运行,您会相信每个实现者都能正确地完成它吗 不管怎样,我都会防御性地编写代码并检查null 现在的大问题是:我们是否应该将“null”和空列表视为同义词?这是规范应该帮助我们的地方,而不是 我的猜测是,空返回(如果确实可能发生)将相当于“我不理解查询”,空列表将是“是的,理解查询,但没有记录” 您可能有一个处理不可解析查询的代码路径(可能是一个例外),我倾向于在该路

如果是,在什么情况下


Javadoc和JPA规范什么也没说

如果说明书上说不可能,你会相信吗?考虑到您的代码可以在不同的JPA实现上运行,您会相信每个实现者都能正确地完成它吗

不管怎样,我都会防御性地编写代码并检查null

现在的大问题是:我们是否应该将“null”和空列表视为同义词?这是规范应该帮助我们的地方,而不是

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


您可能有一个处理不可解析查询的代码路径(可能是一个例外),我倾向于在该路径下指示空返回。

您是对的。JPA规范对此只字不提。但是《Java持久化与Hibernate》第二版说:

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

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

更新

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


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

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

< P>当然,如果您用雅加达的CalpUntudio.ISNoTunTy测试结果集,无论哪种方法都会涉及到您。

如果仔细查看
org.hibernate.loader.loader
(4.1),您将看到列表总是在processResultSet()方法(,)中初始化


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

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

鉴于
org.hibernate.ejb.QueryImpl
类中
getResultsList()
的实现,可以返回
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;
    }

我的hibernate版本是:3.3.1.GA

+1你说得对:“你会相信每一个JPA提供商吗?”否:)编辑添加:Arthur指出,如果没有找到记录,hibernate的JPA实际上返回null。所以实际上,在这种情况下,我们确实需要将空列表和空列表折叠在一起。我相信我们上面所经历的思考过程仍然有效。甚至可以想象,对于不同的JPA堆栈,我们应该对null进行不同的处理。欢迎来到便携乐趣。因为JPA规范没有做它应该做的事情,所以只存在“可移植性乐趣”。。。指定精确的语义。遗憾的是,它是由既得利益委员会管理的。“我不理解查询”应该作为
异常处理
,返回
null
,其中
集合
在返回类型中是一个明显的设计缺陷,我正是在搜索这个问题!tks!把你举起来!对于OpenJPA,我也得到了一个空列表,而不是null。这当然过时了,Hibernate返回一个空列表。我仍然从Hibernate 4.3.10(作为Spring数据的JPA引擎运行)中得到null。这只发生在单个本机查询中,因为典型的JPA查询工作正常。只需使用或检查这两个条件
if(rows==null | | | rows.size==0){}
where rows是getResultList()返回的,必须将其包装在可选的.ofNullable()中,然后进行设置。我相信返回
null
而不是空列表并不是规范的意图,否则它会清楚地表明在其他地方何时需要
null
。尤其是当
getResultList
的文档读取
时,执行一个SELECT查询并将查询结果作为(n)(未键入)列表返回。-@返回结果列表
。当然,我仍然会检查
null
,如果需要,我会自己返回一个空列表。为确切的代码片段干杯。但是这个答案只关注hibernate,它是规范的实现之一。像OpenJPA这样的其他实现在行为上有所不同。另外,hibernate似乎已经改变了不同版本的行为。
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;
    }