繁体   English   中英

加入许多不同的实体时如何将 ScrollableResults 用于 Hibernate 查询

[英]How to use ScrollableResults for Hibernate Queries when joining many different entities

我正在使用 Spring Boot 端点从数据库查询返回结果。 在 TypedQuery 上使用 getResultList() 时它工作正常。 但是我知道我将不得不管理非常大的数据集。 我正在研究通过 hibernate 使用 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)、Object[] 行 vs 对象行等。在所有选项上都有和没有 toString()。 我所做的没有比 java 对象引用更能从行中获得更多信息。 我也尝试过投射并得到“无法投射错误”。 有时我会收到一个错误,“查询指定了一个持有者类”。 不确定这意味着什么,因为我的标准查询是通过加入 1 个或多个实体而构建的,其中实体和所选列事先未知。 所以我实际上并没有指定一个类。 它们的实体和选择由用户输入指定。 有什么想法吗? 谢谢!

更新:我可以做 System.out.println(scroll.getType(0)); 在这种情况下,观察很长时间。 但是当我尝试保存那么长的 (.getLong(0)) 时,我收到错误消息,“查询指定了一个持有者类”。 或者再次无法投射错误。

使用multiselectCriteriaQuery生成 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();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM