加入许多不同的实体时如何使用 ScrollableResults 进行 Hibernate 查询
How to use ScrollableResults for Hibernate Queries when joining many different entities
我正在使用 Spring 引导端点到 return 来自数据库查询的结果。在 TypedQuery 上使用 getResultList() 时效果很好。但是我知道我将不得不管理非常大的数据集。我正在研究通过休眠使用 ScrollableResults,但我不知道如何实际引用每一行的内容。
StatelessSession session = ((Session) entityManager.getDelegate()).getSessionFactory().openStatelessSession();
criteriaQuery.multiselect(selections);
criteriaQuery.where(predicates.toArray(new Predicate[]{}));
Query<?> query = session.createQuery(criteriaQuery);
query.setMaxResults(5);
query.setFetchSize(1000);
query.setReadOnly(true);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
while(results.next()){
Object row = results.get();
}
results.close();
session.close();
我试过results.get(0)、results.get(0)[0]、results.getLong(0)、对象[]行与对象行等。随着并且所有选项都没有 toString() 。我所做的没有比 java 对象引用更有效的了。我也尝试过投射并得到“无法投射错误”。有时我会收到错误消息,“查询指定持有人 class”。不确定这意味着什么,因为我的条件查询是通过加入 1 个或多个实体而构建的,其中实体和选定的列是事先不知道的。所以我实际上并没有指定 class。它们的实体和选择由用户输入指定。有什么想法吗?谢谢!
更新:
我可以做 System.out.println(scroll.getType(0));在这种情况下观察很长时间。
但是,当我尝试保存那么长的时间 (.getLong(0)) 时,我收到错误消息,“查询指定了一个持有人 class”。或者再次出现无法投射错误。
A CriteriaQuery
使用 multiselect
生成一个 Object[] 或 javax.persistence.Tuple
作为结果类型。也许您应该尝试调试以查看实际的对象类型,然后您可以从那里进一步工作。
如果您要处理并返回所有行,则无需使用 ScrollableResults
API,因为无论如何您都必须为所有行创建对象。如果您的用例是进行某种聚合,我建议您改用聚合函数,让数据库进行聚合。
明白了。 queryDetails 是一个 CriteriaQuery<Tuple>
StatelessSession session = entityManagers.get("DatasourceName").unwrap(Session.class).getSessionFactory().openStatelessSession();
Stream<Tuple> resultStream = session.createQuery(queryDetails)
.setReadOnly(true)
.setMaxResults(100)
.setFetchSize(1000)
.setCacheable(false)
.getResultStream();
Iterator<Tuple> itr = resultStream.iterator();
while (itr.hasNext()){
//Get the next row:
Tuple row = itr.next();
}
我正在使用 Spring 引导端点到 return 来自数据库查询的结果。在 TypedQuery 上使用 getResultList() 时效果很好。但是我知道我将不得不管理非常大的数据集。我正在研究通过休眠使用 ScrollableResults,但我不知道如何实际引用每一行的内容。
StatelessSession session = ((Session) entityManager.getDelegate()).getSessionFactory().openStatelessSession();
criteriaQuery.multiselect(selections);
criteriaQuery.where(predicates.toArray(new Predicate[]{}));
Query<?> query = session.createQuery(criteriaQuery);
query.setMaxResults(5);
query.setFetchSize(1000);
query.setReadOnly(true);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
while(results.next()){
Object row = results.get();
}
results.close();
session.close();
我试过results.get(0)、results.get(0)[0]、results.getLong(0)、对象[]行与对象行等。随着并且所有选项都没有 toString() 。我所做的没有比 java 对象引用更有效的了。我也尝试过投射并得到“无法投射错误”。有时我会收到错误消息,“查询指定持有人 class”。不确定这意味着什么,因为我的条件查询是通过加入 1 个或多个实体而构建的,其中实体和选定的列是事先不知道的。所以我实际上并没有指定 class。它们的实体和选择由用户输入指定。有什么想法吗?谢谢!
更新: 我可以做 System.out.println(scroll.getType(0));在这种情况下观察很长时间。 但是,当我尝试保存那么长的时间 (.getLong(0)) 时,我收到错误消息,“查询指定了一个持有人 class”。或者再次出现无法投射错误。
A CriteriaQuery
使用 multiselect
生成一个 Object[] 或 javax.persistence.Tuple
作为结果类型。也许您应该尝试调试以查看实际的对象类型,然后您可以从那里进一步工作。
如果您要处理并返回所有行,则无需使用 ScrollableResults
API,因为无论如何您都必须为所有行创建对象。如果您的用例是进行某种聚合,我建议您改用聚合函数,让数据库进行聚合。
明白了。 queryDetails 是一个 CriteriaQuery<Tuple>
StatelessSession session = entityManagers.get("DatasourceName").unwrap(Session.class).getSessionFactory().openStatelessSession();
Stream<Tuple> resultStream = session.createQuery(queryDetails)
.setReadOnly(true)
.setMaxResults(100)
.setFetchSize(1000)
.setCacheable(false)
.getResultStream();
Iterator<Tuple> itr = resultStream.iterator();
while (itr.hasNext()){
//Get the next row:
Tuple row = itr.next();
}