У меня есть БД, в которой хранится архив сообщений, моя цель - получить имя пользователя и количество сообщений, соответствующих определенному паттерну, затем вывести все это постранично в браузер. В таблице чуть меньше 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);
}