2015-09-03 5 views
2

Я нашел несколько решений в Интернете, но в аспекте производительности это не то, что я искал. У меня есть таблица с записями более 10 000 000 записей. Мне нужно только для чтения 150 результатов.Получить определенное количество записей из базы данных - JPA (Impove performance)

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(); 

Этот код выполняет эту работу. Но он все еще читает все 10 000 000 записей из db , что делает огромную перегрузку на веб-сервере. Могу ли я просто ограничить запрос, например,

SELECT *FROM Persons LIMIT 5; 

Есть ли способ ограничить результат самим запросом ?? Любая помощь очень ценится.

спасибо.

+1

Вы можете попробовать что-то вроде 'ВЫБРАТЬ 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 записей из db, а затем ограничивает набор результатов. Это то, о чем я хочу избавиться. Я хочу ограничить результат самим запросом. – bynu022

+0

1. Если вы хотите ограничить результаты самим запросом, вам придется добавить некоторые условия в ваше предложение, которое я боюсь ... 2. В том случае, когда я описал (в котором вы выбираете часть) JPA отправит запрос, который включает в себя OFFSET и LIMIT в базовую СУБД. Поэтому, когда выбор медленный JPA/Hibernate не виноват;) – Talorias

+0

JPA использует setFirstResult и setMaxResults непосредственно при построении SQL-запроса, обычно используется ключевое слово LIMIT со значением, переданным MaxResults, но это зависит от типа базы данных и JPA настройки поставщика. Вы уверены, что запрос JPA получает все записи, а не только записи maxResults? Если да, то пелаза напишите, какая у вас база данных (MySQL?)? Hibernate должен быть настроен с правильным диалектом для вашей базы данных, чтобы правильно построить запрос. – OndrejM

Смежные вопросы