filter - primefaces dataTable filterBy 不调用 load 方法
问题描述
我正在将 primefaces 3 升级到 8。已经在 3 中工作的数据表过滤器在 8 中开始无法正常工作。在输入现有值以过滤不返回数据时,似乎没有触发“加载”方法。但是,排序列正在触发加载方法。
我将primefaces展示中的工作示例与数据表的惰性示例进行了比较,它已经相同了。检查日志,检查页面是否有任何错误,但找不到任何东西。
为什么它不工作?我该如何调试它?
<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;
}
}
上面 load 方法中的 logBo.listLogs 只是调用下面的 findEntities 方法。但是我不认为执行到达这里,因为尽管在排序中被调用并正常工作,但在过滤时从未调用过上面的加载方法。我这么认为是因为 logBo.listLogs 之前的 printly
@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更新:似乎我弄错了,在过滤器期间调用了负载。可能我需要检查我的自定义通用过滤代码。
解决方案
我发现,一旦我在 A 列 filterBy 字段中输入了一些值,我故意留空的其他列 filterBy 字段将进入自定义查询:
CriteriaImpl(com.xxx.model.OperationLogs:this[][1=1, custNo like 11111%, refNo like null%, username like null%])
所以在查询生成时添加一个控件:
if(entry.getValue().getFilterValue() == null) {
continue;
}
刚过:
if (filters != null && !filters.isEmpty()) {
Iterator<Entry<String, FilterMeta>> iterator = filters.entrySet()
.iterator();
while (iterator.hasNext()) {
解决了这个问题。
我正在进行全面升级,包括 Primefaces、JSF、Spring、Hibernate 等。我想我在休眠升级中遗漏了一些东西,因为它在以前的版本中成功运行。
推荐阅读
- google-cloud-platform - 为什么 ParDo 不能在 DataflowRunner 上工作?
- sql - 使用 NorthWind 数据库,编写 SQL 语句,报告每个员工的姓名和该员工接受的任何订单
- html - VS 代码在制表键和空格键后删除空格(不能缩进)
- sql - T-SQL:将数字 (19,0) 转换为日期时间
- python - 如何在熊猫中其他 2 个单元格相等的情况下向前填充 na?
- xml - XSLT - 从多次出现的元素中删除空格和连字符
- python - 从 wiki 上抓取表格。Python 与 bs4
- scheme - 在 Racket 中使用本地而不是辅助函数
- spring - Spring Security RolesAllowed 和 thymeleaf sec:authorize
- python - Django ValueError:需要 3 个值才能在 for 循环中解压;得到 2. 如何解压模板中的压缩数据?