2015-01-30 3 views
0

В нашем приложении у нас есть экран поиска с несколькими полями фильтра. Когда вы нажимаете кнопку поиска, выполняется запрос, который извлекает несколько результатов и перечисляет их в сетке.setMaxResults в JPA в сочетании с подключением fetch

Однако может быть много данных, поэтому мы хотим ограничить количество возвращенных результатов до 1000. Мы используем OpenJPA для сопоставления возвращаемых записей с нашими классами моделей и SQL-сервером в качестве механизма базы данных. Некоторое время я ограничил количество возвращаемых результатов, используя этот код:

return entityManager.createQuery(query).setMaxResults(1000).getResultList(); 

Это работало замечательно, пока я недавно добавил пару присоединяется к исходному запросу.

Предположим, например, что вы хотели бы получить 10 «Контакты». Каждый контакт имеет 5 адресов. Когда я выполнить следующий запрос:

select c from Contact c left join fetch c.address 

Фактический запрос, который выполняется выбирает 50 записей (5 строк на контакт, 1 для каждого адреса). И это для 10 контактов.

и ограничить его до результатов и проверить запрос, который выполняется в базе данных, он переводится на «SELECT TOP 10 FROM ...».

Это означает, что 10 записей, а не 10 объектов. Поэтому в моем примере возвращенный список контактов будет содержать 2 контакта с их 5 адресами.

Так что это подводит меня к моему вопросу: что я могу сделать для обеспечения полных данных 10 объектов возвращается вместо первых 10 записей?

ответ

1

Я предполагаю, что контакт может не иметь ровно 5 адресов (потому что, если бы это было так, ответ был бы тривиальным).

У вас нет конструкции запроса в SQL (насколько я знаю, хотя вы должны проверить документацию своего поставщика) или JPQL, которые могут сделать запрос, чтобы сделать то, что вы хотите. Таким образом, ваш единственный вариант - получить страницу из БД, как вы делаете сейчас, затем подсчитать количество возвращенных контактов, а затем получить следующую страницу, если вам нужно больше, и так далее, пока у вас не будет достаточно контактов. Для этого вы должны использовать setFirstResult, а также setMaxResults.