有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在加入多个不同实体时使用ScrollableResults进行Hibernate查询

我使用Spring引导端点从数据库查询返回结果。在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();

我已经试过了。获取(0),结果。获取(0)[0],结果。getLong(0)、Object[]行与Object行等,在所有选项上使用或不使用toString()。我所做的任何事情都不会比java对象引用更能从行中获益。我也试过施法,但得到了一个“不能施法错误”。有时我会遇到一个错误,“query指定了一个holder类”。不确定这意味着什么,因为我的条件查询是通过连接一个或多个实体构建的,而这些实体和所选列之前是未知的。因此,我实际上并没有指定一个类。这些实体和选择由用户输入指定。有什么想法吗?谢谢

更新: 我可以做这个系统。出来println(scroll.getType(0));在这种情况下,观察一个长的时间。 但是,当我试图保存该long(.getLong(0))时,我得到一个错误,“query指定了一个holder类”。或者再次出现“无法强制转换”错误


共 (2) 个答案

  1. # 1 楼答案

    弄明白了。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();
    
    }
    
  2. # 2 楼答案

    使用multiselectCriteriaQuery生成一个对象[]或javax.persistence.Tuple作为结果类型。也许您应该尝试调试以查看实际的对象类型,并从中进一步工作

    如果仍要处理并返回所有行,则无需使用ScrollableResultsAPI,因为仍需为所有行创建对象。如果您的用例是进行某种聚合,我建议您改用聚合函数,让数据库进行聚合