当前位置: 首页 > 知识库问答 >
问题:

primeface dataTable filterBy不调用load方法

左丘阳晖
2023-03-14

我正在将primeface 3升级到8。3中已经工作的可数据过滤器在8中开始无法正常工作。输入现有值以过滤未返回数据时,似乎未触发“加载”方法。但是,排序列正在触发加载方法。

我与primefaces showcase中的工作示例进行了比较,结果是相同的。检查日志,检查页面是否有错误,但什么也找不到。

为什么它不起作用?如何调试它?

<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方法。但是我不认为执行会到达这里,因为上面的load方法在过滤时从来没有被调用过,尽管在排序中被调用并正常工作。我这样认为是因为在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更新:似乎我弄错了,加载在过滤过程中被调用。可能我需要检查我的自定义通用过滤代码。

共有1个答案

王叶五
2023-03-14

我发现,一旦我在列A filterBy字段中输入一些值,我故意留空的其他列filterBy字段就会进入自定义查询,如下所示:

criteria impl(com . XXX . model . operation logs: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()) {

解决了问题。

我正在进行全面升级,包括Primeface、JSF、Spring、Hibernate等,我想我在hibernate升级中错过了一些东西,因为它在以前的版本中成功运行。

 类似资料:
  • 主要内容:jQuery load() 方法,实例,实例,实例jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法。 load() 方法从服务器加载数据,并把返回的数据放入被选元素中。 语法: $(selector).load(URL,data,callback); 必需的 URL 参数规定您希望加载的 URL。 可选的 data 参数规定与请求一同发送的查询字符串键/值对集合。 可选的 callback 参数是

  • 本文向大家介绍jQuery的load()方法及其回调函数用法实例,包括了jQuery的load()方法及其回调函数用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery的load()方法及其回调函数用法。分享给大家供大家参考。具体如下: 下面的js代码演示了jQuery的load()方法的使用,并演示了带回调函数(callback)的load方法的使用 希望本文所述对大家的j

  • (我使用的是Mongo Java Driver 2.12.0和RoboMongo。) 我正在从java创建一个mongo DB,并用所有来自java的数据填充它。所有这些对我来说都很有效。我已经在我的数据库中制作了几个我想要的javascript函数。如果我通过Robomongo shell手动插入这些函数,使用: 并在java中通过db.eval()调用这些函数,这些函数运行得很好。现在我想做的

  • 我尝试使用带有LazyDataModel的Datascroller,并且来自lazy数据模型的load方法被调用了两次。 由于我的惰性数据模型不是幂等的(也就是说,在相同的窗口/页面大小上连续两次调用该模型会返回不同的结果),多次调用load方法并不是很好(这可能会执行昂贵的服务器/DB往返),因此我认为调用load方法并不是很好的,而调用load方法两次的事实意味着:呈现的结果是不正确的。 da

  • 问题内容: 我已经看到很多类似问题的问题和解决方案,但对我来说没有任何效果。我有这个: 但这不起作用。为了澄清,我想将内容加载到中,然后返回的内容。但是,即使我已将其放入回调函数中,也似乎在加载内容之前返回了该内容。 问题答案:

  • 问题内容: 我正在尝试使用自定义方案从网页打开我的应用程序。该应用已打开,但未调用以下方法: 我的样子如下: 该项目是使用Xcode 11.1创建的,我正在iOS 13上进行测试。 问题答案: 在您的场景委托中实施。 如果该网址启动了您的应用,则您将获得该网址,它位于中。