Любая идея, как реализовать представление, которое приносит только значения, которые вы искали? - PullRequest
0 голосов
/ 16 января 2019

Я собираю страницу поиска, которая использует базу данных с более чем 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));
            }
        }
    }

}```


1 Ответ

0 голосов
/ 16 января 2019

Трудно загрузить все данные впереди, когда они большие. Можете ли вы выполнить внутренний запрос, когда поле поиска теряет фокус?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...