Hibernate - 从服务层的DAO获取ScrollableResults

问题描述:

在某些情况下,我需要读取批处理的数据库表的所有行。为了与db沟通我使用DAO。所以在服务层上,我可以做类似dao.getAll()的事情。为此,我需要从dao返回每行数据库。如果出现“内存不足错误”,我无法返回包含所有实体的List,因为表格非常大。分页不是一个好的解决方案,因为它会导致多个数据库调用。 所以有一个叫做的东西,它允许我滚动浏览所有实体并处理每一行而不会溢出内存。由于我使用DAO,我必须将每行从DAO返回到服务层。我怎样才能做到这一点?是否有其他解决方案来解决这个问题?我正在使用嵌入式Derby数据库的Hibernate。Hibernate - 从服务层的DAO获取ScrollableResults

这可以通过查询接口和标准,以及完成..

Query query = session.createQuery(query); 
query.setReadOnly(true); 
query.setFetchSize(Integer.MIN_VALUE); 
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY); 
// iterate over results 
while (results.next()) { 
    Object row = results.get(); 
    // process row then release reference 
    // you may need to evict() as well 
} 
results.close(); 

这里Hibernate将仍然缓存结果的会话,所以你需要调用session.evict()或会话。清楚()每隔一段时间。

当不需要缓存时,最好使用StatelessSession。

ScrollableResults results = session.createQuery(query) .setReadOnly(true).setFetchSize(1000).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY) 
+0

好吧,但这样做,我会在处理结果时在我的DAO中拥有业务逻辑。这就是我想要避免的。我以为我可以在DAO之外得到结果,并在另一个课程中处理它们。那可能吗? – Joey