Как реализовать фильтрацию в DAO для лениво загруженных фильтров DataTable (включая перечисление mulit select) - PullRequest
0 голосов
/ 05 июля 2019

Я не знаю, как подготовить запрос JPA (EclipseLink) (с CtriteriaBuilder), который будет включать в себя все значения фильтров, поступающие из Primefaces dataTable (с отложенной загрузкой).

Нашел запись на форуме https://forum.primefaces.org/viewtopic.php?p=83497&sid=1459f3a15c3c068aa77912f1bf495370#p83497, но я действительно не мог понять, как применить ее для моего случая.

XHTML:

<p:dataTable id="datalist" 
             value="#{zadaniaController.lazyModel}" 
             var="item"
             lazy="true"
....

контроллер Реализует метод load (), необходимый для отложенной загрузки:

@PostConstruct
    public void postConstruct() {
        lazyModel = new LazyDataModel<Zadanie>() {
            private static final long serialVersionUID = 1L;
            @Override
            public List<Zadanie> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
                if (null == sortField) {
                    //I want by default items to be sorted from newest to oldest
                    sortField = "terminWykonania";
                    sortOrder = SortOrder.DESCENDING;
                }
                List<Zadanie> result = ejbFacade.getResultList(first, pageSize, sortField, sortOrder, filters);
                lazyModel.setRowCount(ejbFacade.count(filters));
                return result;
            }
        };
    }

и DAO:

@Stateless
public class ZadaniaFacade extends AbstractFacade<Zadanie> {
...
    public List<Zadanie> getResultList(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Zadanie> cq = cb.createQuery(Zadanie.class);
        Root<Zadanie> zadanie = cq.from(Zadanie.class);

        if (null != filters) {         
            cq.where(zadaniaFacade.getFilterCondition(cb, zadanie, filters));
            if (sortField != null) {
                if (sortOrder == SortOrder.ASCENDING) {
                    cq.orderBy(cb.asc(zadanie.get(sortField)));
                } else if (sortOrder == SortOrder.DESCENDING) {
                    cq.orderBy(cb.desc(zadanie.get(sortField)));
                }
            }
        }
        TypedQuery<Zadanie> query = em.createQuery(cq);
        query.setFirstResult(first);
        query.setMaxResults(pageSize);
        List<Zadanie> list = query.getResultList();
        return list;
    }

private Predicate getFilterCondition(CriteriaBuilder cb, Root<Zadanie> zadanie, Map<String, Object> filters) {
        Predicate filterCondition = cb.conjunction();

        for (Map.Entry<String, Object> filter : filters.entrySet()) {
            switch (filter.getKey()) {
                case "status":
                   // I have multiple columns on the view, some are plain text that I should do LIKE, some are multiple select dropdowns, some are dates (from-to)
                    break;
                default:
                    throw new AssertionError();
            }
        }
        return filterCondition;
    }

Как подготовить запрос в DAO?

ПФ 6,1

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