2015-09-03 41 views
2

我在互聯網上發現了幾種解決方案,但在性能方面,這些不是我搜索的內容。我有一張記錄超過10,000,000條記錄的表格。我需要只讀過去的150個結果從數據庫中檢索特定數量的記錄 - JPA(Impove性能)

query.select(trailRoot).distinct(Boolean.TRUE) 
    .where(buildPredicateForAuditTrail(auditTrailCriteria, criteriaBuilder, trailRoot)); 

final TypedQuery<AuditTrail> typedQuery = entityManager.createQuery(query); 
return typedQuery.setFirstResult(auditTrailCriteria.calculateFirstResultIndex()) 
    .setMaxResults(150).getResultList(); 

該代碼完成這項工作。但它仍然從db 中讀取所有10,000,000條記錄,這使得web服務器中出現巨大的過載。我可以簡單地限制查詢,如

SELECT *FROM Persons LIMIT 5; 

有沒有辦法通過查詢本身來限制結果? 任何幫助是高度讚賞。

謝謝。

+1

你可以嘗試像'SELECT TOP 150 * FROM人員ORDER BY ID DESC' – SaviNuclear

+0

@saviNuclear你的意思是一個命名查詢? – bynu022

+0

LIMIT顯然不是JPQL關鍵字,也不是「*」有效......請參閱任何JPQL參考。 MaxResults/FirstResult是您爲JPQL –

回答

1

爲什麼不能將第一個結果設置爲特定的偏移量?

query.setFirstResult(firstResult); 
query.setMaxResults(maxResults); 

看一看LazyCarDataModel.java http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml

+0

設置的內容謝謝您的回覆。當然我可以做到。設置最大的結果完成這項工作。但我的問題是,查詢仍然從數據庫中讀取所有10,000,000條記錄,然後限制結果集。那是我想要擺脫的pecess。我想通過查詢本身來限制結果。 – bynu022

+0

1.如果你想通過查詢本身限制結果,你將不得不在你的where子句中添加一些條件...... 2.在我描述的情況下(你選擇一個部分)JPA會發送包含OFFSET和LIMIT的查詢到底層DBMS。所以當JPA/Hibernate選擇緩慢時不要怪怪); – Talorias

+0

JPA在構建SQL查詢時直接使用setFirstResult和setMaxResults,通常LIMIT關鍵字與傳遞給MaxResults的值一起使用,但這取決於數據庫類型和JPA提供者設置。你確定JPA查詢檢索所有記錄,而不僅僅是maxResults記錄嗎?如果是,pelase寫什麼是你的數據庫(MySQL?)?應該爲數據庫配置正確的方言,以正確構建查詢。 – OndrejM

相關問題