@Hangover13

Как сформировать пагинацию с выводом количества дубликатов?

У меня есть БД, в которой хранится архив сообщений, моя цель - получить имя пользователя и количество сообщений, соответствующих определенному паттерну, затем вывести все это постранично в браузер. В таблице чуть меньше 2 миллионов строк и будет становиться все больше. Проблема в том, что вывод количества сообщений неверен и он соответствует размеру@PageableDefault. В данный момент я использую Pageable.unpaged() для обхода проблемы. Есть ли другой способ сделать так, чтоб на странице подгружалось количество всех сообщений, принадлежащих данному пользователю? Это помогло бы ускорить загрузку итоговой таблицы.

Сущность архива:
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Archive {
    private String username;
    private String txt;
    private long id;
    private Timestamp createdAt;

    @Basic
    @Column(name = "username", nullable = false, length = 191)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "txt", nullable = true, length = -1)
    public String getTxt() {
        return txt;
    }

    public void setTxt(String txt) {
        this.txt = txt;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic
    @Column(name = "id", nullable = false)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "created_at", nullable = false)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Timestamp getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Timestamp createdAt) {
        this.createdAt = createdAt;
    }


Репозиторий архива:
Page<Archive> findByUsernameContainsAndCreatedAtGreaterThanEqualAndCreatedAtLessThanEqualAndTxt(String username, Timestamp createdAt, Timestamp createdAt2, String txt, Pageable pageable);


Сервис архива:
public Page<Report> getOrgData(String username, Timestamp from, Timestamp to, Status status, @PageableDefault(size = 15) Pageable pageable) {
        pageable = Pageable.unpaged();
        String statusString = getStatusString(status);
        Page<Archive> find = repo.findByUsernameContainsAndCreatedAtGreaterThanEqualAndCreatedAtLessThanEqualAndTxt(
                username,
                from,
                to,
                statusString,
                pageable
        );
        return getReport(find);


Формирование отчета:
public Page<Report> getReport(Page<Archive> archive) {
        LinkedHashMap<String, Long> resultMap = new LinkedHashMap<>();
        List<Report> report = new ArrayList<>();
        archive.forEach(a -> resultMap.put(a.getUsername(), resultMap.getOrDefault(a.getUsername(), 0L) + 1L));
        resultMap.forEach((key, value) -> report.add(new Report(key, value)));
        return new PageImpl<>(report);
    }
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы