是否可以使用 JPA 从 javax.persistence.Query.getResultList() 流式传输结果?

Posted

技术标签:

【中文标题】是否可以使用 JPA 从 javax.persistence.Query.getResultList() 流式传输结果?【英文标题】:Is it possible using JPA to stream results from javax.persistence.Query.getResultList()? 【发布时间】:2011-01-20 06:21:06 【问题描述】:

我是 JPA 的新手,我想知道是否可以从结果集中流式传输数据,我的意思是我不想等待执行查询以开始处理第一个结果,例如在批量的情况下。

是否有可能使用 JPA API 或任何社区采用的解决方法?最终使用 JPA 实现的功能?

【问题讨论】:

事实上,“流”一词“滚动”似乎更接近我所表达的意思。我在 Hibernate 中找到了一个实现(Query.scroll),它允许在结果到达时浏览结果,但我在 JPA 规范 hibernate.org/hib_docs/v3/api/org/hibernate/… 中找不到任何相关内容 【参考方案1】:

出于显而易见的原因,“主”选择必须在对结果集进行任何操作之前完成。我不确定您要在这里实现什么...也许您需要使某些字段变得惰性,以便更快地获得第一个结果并在处理它们时获取详细信息?

【讨论】:

【参考方案2】:

使用@javax.persistence.PostLoad 注解对您来说可行吗?通过这种方式,您可以将操作与从数据存储创建给定对象的那一刻联系起来。我不确定这是否正是您要寻找的。​​p>

【讨论】:

【参考方案3】:

你可以在 JPA 上使用真正的流:

public interface UserRepository extends JpaRepository<User, Integer> 
    // ...
    Stream<User> findAllByName(String name);
    // ...

您可以在this nice article 中找到更多示例。

【讨论】:

【参考方案4】:

现在javax.persistence.TypedQuery 现在有getResultStream() 流数据的方法,但是默认实现仅将getResultList() 包装到流中(因此,无论如何它会将所有数据加载到内存中)。但是 Hibernate 用真正的流媒体覆盖了这种行为。

【讨论】:

以上是关于是否可以使用 JPA 从 javax.persistence.Query.getResultList() 流式传输结果?的主要内容,如果未能解决你的问题,请参考以下文章

从 JDBC 迁移到 JPA [关闭]

JPA:命名查询数据库独立性

是否可以在 JPA 中使用窗口函数?

是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?

如何使用 JPA Criteria API 连接不相关的实体

JBoss 5.1:使用 JPA 休眠