簡體   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