我正在将素数3从8升级到8。已经在3中工作的数据表过滤器在8中开始无法正常工作。在输入现有值以过滤器不返回数据的情况下,“ load”方法似乎未触发]]。但是,排序列正在触发加载方法。
我与primaryfaces展示柜中的工作示例进行比较,以获得数据表的惰性示例,其已经相同。已检查的日志,已检查的页面是否有任何错误,但找不到任何内容。
为什么不起作用?如何调试?
<ui:define name="content"> <h:form id="logsform"> <p:panel> <p:dataTable id="tbl" var="log" value="#{logBean.operationLogDataModel}" lazy="true" rows="10" paginator="true" emptyMessage="#{messages['common.datatable.emptymessage']}"> <p:column sortBy="#{log.custNo}" filterBy="#{log.custNo}"> <f:facet name="header"> <h:outputText value="CustNo" /> </f:facet> <h:outputText value="#{log.custNo}" /> </p:column> </p:dataTable> </p:panel> </h:form>
我的logBean可能是:
@ViewScoped @FacesConfig(version = FacesConfig.Version.JSF_2_3) @Named("logBean") public class LogBean implements Serializable { @Inject @ManagedProperty("#{logBo}") private LogBo logBo; OperationLogDataModel operationLogDataModel; AuthUser authUser = (AuthUser) SecurityContextHolder.getContext().getAuthentication(); public LogBean() { } @PostConstruct public void initModel() { operationLogDataModel = new OperationLogDataModel(logBo, authUser); documentLogList = new ArrayList<DocumentLog>(); } . . }
我的lazyDataModel如下:
public class OperationLogDataModel extends LazyDataModel<OperationLogs> { private static final Logger LOG = Logger.getLogger(OperationLogDataModel.class); private LogBo logBo; private String currentSortField; private SortOrder currentSortOrder; private Map<String, FilterMeta> currentFilters; AuthUser authUser; private Date startDate; private Date finishDate; public OperationLogDataModel() { } public OperationLogDataModel(LogBo logBo, AuthUser authUser) { this.authUser = authUser; this.logBo = logBo; super.setPageSize(Configurations.PAGE_SIZE); } public OperationLogDataModel(LogBo logBo, AuthUser authUser, Date startDate, Date finishDate) { this.logBo = logBo; this.authUser = authUser; super.setPageSize(Configurations.PAGE_SIZE); this.startDate = startDate; this.finishDate = finishDate; } @Override public List<OperationLogs> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, FilterMeta> filters) { currentSortField = sortField; currentSortOrder = sortOrder; currentFilters = filters; if (sortField == null) { sortField = "createTime"; sortOrder = SortOrder.DESCENDING; } Criterion sqlRestriction = Restrictions.sqlRestriction("1=1"); if (startDate != null) sqlRestriction = Restrictions.and(sqlRestriction, Restrictions.ge("createTime", startDate)); if (finishDate != null) sqlRestriction = Restrictions.and(sqlRestriction, Restrictions.le("createTime", finishDate)); List<OperationLogs> logs = new ArrayList<OperationLogs>(); try { if (authUser.getAuthorityName().equals(Role.ROLE_ORDINARY.getName())) sqlRestriction = Restrictions.and(sqlRestriction, Restrictions.eq("username", authUser.getName())); super.setRowCount(logBo.countLogs(-1, -1, null, sortOrder.name(), filters, null, sqlRestriction).intValue()); System.out.println("load called!"); logs = logBo.listLogs(first, pageSize, sortField, sortOrder.name(), filters, null, sqlRestriction); } catch (Exception e) { LOG.error(e, e); } return logs; } @Override public String getRowKey(OperationLogs logs) { return logs.getId() + ""; } @Override public OperationLogs getRowData(String rowKey) { try { return logBo.getLogById(Long.parseLong(rowKey)); } catch (Exception e) { return null; } } @Override public void setPageSize(int pageSize) { super.setPageSize(pageSize); } public void onFilter(AjaxBehaviorEvent event) { } public String getCurrentSortField() { return currentSortField; } public void setCurrentSortField(String currentSortField) { this.currentSortField = currentSortField; } public SortOrder getCurrentSortOrder() { return currentSortOrder; } public void setCurrentSortOrder(SortOrder currentSortOrder) { this.currentSortOrder = currentSortOrder; } public Map<String, FilterMeta> getCurrentFilters() { return currentFilters; } public void setCurrentFilters(Map<String, FilterMeta> currentFilters) { this.currentFilters = currentFilters; } }
logBo.list上面的load方法中的登录只是在下面调用findEntities方法。但是我不认为执行会到达此处,因为尽管进行了调用并在排序中正常工作,但在过滤时从未调用上述load方法。我认为是因为在logBo.listLogs之前打印]
@Override public List<T> findEntities(int first, int pageSize, String sortField, String sortOrder, Map<String, FilterMeta> filters, Map<String, String> aliases, Criterion extraCriterion) throws SecurityException, NoSuchFieldException { Criteria crit = sessionFactory.getCurrentSession().createCriteria( getPersistentClass()); crit = prepareCriteria(first, pageSize, sortField, sortOrder, filters, aliases, extraCriterion, crit); crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return crit.list(); } private Criteria prepareCriteria(int first, int pageSize, String sortField, String sortOrder, Map<String, FilterMeta> filters, Map<String, String> aliases, Criterion extraCriterion, Criteria crit) throws NoSuchFieldException { if (aliases != null && !aliases.isEmpty()) { Iterator<Entry<String, String>> iterator = aliases.entrySet() .iterator(); while (iterator.hasNext()) { Entry<String, String> entry = iterator.next(); crit.createAlias(entry.getKey(), entry.getValue(), Criteria.LEFT_JOIN); } } if (extraCriterion != null) { crit.add(extraCriterion); } if (sortField != null && !sortField.isEmpty()) { if (!sortOrder.equalsIgnoreCase("UNSORTED")) { if (sortOrder.equalsIgnoreCase("ASCENDING")) { crit = crit.addOrder(Order.asc(sortField)); } else { crit = crit.addOrder(Order.desc(sortField)); } } } if (filters != null && !filters.isEmpty()) { Iterator<Entry<String, FilterMeta>> iterator = filters.entrySet() .iterator(); while (iterator.hasNext()) { Entry<String, FilterMeta> entry = iterator.next(); Class<?> type = getPersistentClass().getDeclaredField( entry.getKey()).getType(); try { if (type.isEnum() || Number.class.isAssignableFrom(type) || Double.class.isAssignableFrom(type)) { crit = crit.add(Restrictions.eq(entry.getKey(), type .getDeclaredMethod("valueOf", String.class) .invoke(null, entry.getValue()))); } else { crit = crit.add(Restrictions.like(entry.getKey(), String.valueOf(entry.getValue().getFilterValue()), MatchMode.START)); } } catch (Exception ex) { } } } if (first != -1) { crit = crit.setFirstResult(first); } if (pageSize != -1) { crit = crit.setMaxResults(pageSize); } return crit; }
PS更新:似乎我弄错了,在筛选期间调用了load。可能需要检查我的自定义通用过滤代码。
我正在将素数3从8升级到8。已经在3中工作的数据表过滤器在8中开始无法正常工作。在输入现有值以过滤器不返回数据的同时,“ load”方法似乎不是...
CriteriaImpl(com.xxx.model.OperationLogs:this [] [1 = 1,custNo如11111%,refNo如null%,用户名如null%])