javax.persistence.Query.getResultList()是否可以返回null?
如果是的话,在什么情况下?
Javadoc和JPA规范什么也没说。
你是对的。 JPA规范没有说到这一点。 但Java持久与Hibernate的书,第二版说:
如果查询结果为空,则返回null
当您调用query.getResultList()而没有结果时,Hibernate JPA实现(实体pipe理器)将返回null。
UPDATE
正如一些用户指出的那样,Hibernate的最新版本似乎返回一个空列表。
如果说规格说不能发生,你会相信吗? 考虑到你的代码可能会运行在不同的JPA实现上,你会相信每个实现者都能正确实现吗?
不pipe怎样,我都会在防守方面进行编码并检查是否为null。
现在最大的问题是:我们应该把“空”和空列作为同义词吗? 这是规格应该帮助我们的地方,而不是。
我的猜测是,一个空返回(如果确实可能发生)将等于“我不明白查询”,空列表将是“是的,了解查询,但没有logging”。
你可能有一个代码path(可能是一个例外),处理不可分析的查询,我倾向于指向一个空的返回下来的path。
与亚瑟的post相反,当我真的跑了一个没有实体匹配的查询时,我得到了一个空列表,而不是null。 这是使用hibernate,我认为是正确的行为:当你要求一个实体的集合,没有任何空列表是正确的答案。
当然,如果你用雅加达的CollectionUtils.isNotEmptytesting结果集,那么你可以用任何方式来覆盖。
如果仔细看看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。
- Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct
- hibernate和没有PK
- 何时以及如何使用hibernate二级caching?
- 对象引用未保存的瞬态实例 – 在刷新之前保存瞬态实例
- 什么是在Web应用程序中的jpa persistence.xml中引用jar文件的正确path?
- JPQL在select语句中创build新对象 – 避免还是拥抱?
- 注解@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)有什么用? 为什么生成types是身份?
- JPA OneToMany和ManyToOne关系
- 做一对一关系懒