Я не знаю, как подготовить запрос 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