Я собираю страницу поиска, которая использует базу данных с более чем 1000 000 реестров. Любая идея, как реализовать представление, которое приносит только значения, которые вы искали? Я смог сделать это с меньшей БД (300), однако он загружает все реестры в представлении перед поиском. Мне нужно, чтобы ничего не возвращалось, если поле поиска пусто.
(Spring MVC, JPA, Hibernate и Thymeleaf).
@PersistenceContext
private EntityManager manager;
@SuppressWarnings("unchecked")
@Override
@Transactional(readOnly = true)
public Page<Alarme> filtrar(Alarme filtro, Pageable pageable) {
int paginaatual = pageable.getPageNumber();
int totalRegistrosPorPagina = pageable.getPageSize();
int primeiroRegistro = paginaatual * totalRegistrosPorPagina;
Criteria criteria = manager.unwrap(Session.class).createCriteria(Alarme.class);
criteria.setFirstResult(primeiroRegistro);
criteria.setMaxResults(totalRegistrosPorPagina);
Sort sort = pageable.getSort();
System.out.println(">>> sort: " + sort);
if (sort != null) {
Sort.Order order = sort.iterator().next();
String property = order.getProperty();
criteria.addOrder(order.isAscending() ? Order.asc(property) : Order.desc(property));
}
adicionarFiltro(filtro, criteria);
return new PageImpl<>(criteria.list(), pageable, total(filtro));
}
private Long total(Alarme filtro) {
Criteria criteria = manager.unwrap(Session.class).createCriteria(Alarme.class);
adicionarFiltro(filtro, criteria);
criteria.setProjection(Projections.rowCount());
return (Long) criteria.uniqueResult();
}
private void adicionarFiltro(Alarme filtro, Criteria criteria) {
if(filtro != null){
if(!StringUtils.isEmpty(filtro.getIncidente())){
criteria.add(Restrictions.ilike("incidente", filtro.getIncidente(), MatchMode.ANYWHERE));
}
}
if(filtro != null){
if(!StringUtils.isEmpty(filtro.getSite())){
criteria.add(Restrictions.ilike("site", filtro.getSite(), MatchMode.ANYWHERE));
}
}
}
}```