【问题标题】:Primefaces Lazy Filtering IssuePrimefaces 延迟过滤问题
【发布时间】:2012-11-27 05:58:01
【问题描述】:

我正在尝试在我的应用程序中实现延迟加载,但我的过滤存在问题。此时排序工作正常。使用延迟过滤后,数据表最初会从表中加载正确的计数,即 24 条记录,但它会一遍又一遍地重复第一条和第二条记录。非常感谢任何帮助。

这是我的 ScreenshotListProducer 类代码:

    @ManagedBean
    @RequestScoped
    public class ScreenshotListProducer implements Serializable  {
       private static final long serialVersionUID = 1L;
       @Inject
       private EntityManager em;

       private List<Screenshot> screenshots;

       private LazyDataModel<Screenshot> lazyModel = null;

       private int pageSize = 5;

       public void setPageSize(int pageSize) {
           this.pageSize = pageSize;
       }

       public int getPageSize() {
           return pageSize;
       }

       @Produces
       @Named
       public List<Screenshot> getScreenshots() {
          System.out.println("************* getting screenshots list **************");
          return screenshots;
       }

       @PostConstruct
       public void LoadData() {
         lazyModel = new LazyDataModel<Screenshot>() {
        private static final long serialVersionUID = 1L;

      @Override
      public List<Screenshot> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { 
           int start = first;
                  int end = first + pageSize;
                  if (sortField == null) {
                     sortField = "time";
                  }

                 try {
               CriteriaBuilder cb = em.getCriteriaBuilder();
               CriteriaQuery<Screenshot> criteria = cb.createQuery(Screenshot.class);
               Root<Screenshot> screenshot = criteria.from(Screenshot.class);

               // sorting
               if (sortOrder.equals(SortOrder.ASCENDING))
                {
                  criteria.select(screenshot).orderBy(cb.asc(screenshot.get(sortField)));
                }
                else if (sortOrder.equals(SortOrder.DESCENDING))
                {
                   criteria.select(screenshot).orderBy(cb.desc(screenshot.get(sortField)));
                }

               // From
               Root<Screenshot> from = criteria.from(Screenshot.class);

               List<Predicate> predicates = new ArrayList<Predicate>();

               if (filters != null) {
                  // filters
                  for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
                     String filterProperty = it.next(); // table column name = field name
                     System.out.println("filterProperty is: " + filterProperty);

                     String filterValue = filters.get(filterProperty);
                     System.out.println("filterValue is: " + filterValue);

                     Expression<String> literal = cb.literal((String)filterValue);
                     predicates.add(cb.like(from.<String>get(filterProperty), literal));
                  }
                  criteria.where(predicates.toArray(new Predicate[predicates.size()]));
               }

               TypedQuery<Screenshot> s = em.createQuery(criteria);
               s.setMaxResults(end - start);
               s.setFirstResult(start);

               screenshots = s.getResultList();

            } catch (NullPointerException e) {
               e.printStackTrace();
            }

                          return screenshots;
           }

         };

   lazyModel.setRowCount(24);
   lazyModel.setPageSize(pageSize);

   if (lazyModel.getRowIndex() == -1 || lazyModel.getPageSize() == 0) {
            lazyModel.setRowIndex(-1);
       }
       else
           lazyModel.setRowIndex(lazyModel.getRowIndex() % lazyModel.getPageSize());
       }

   public LazyDataModel<Screenshot> getLazyModel() {
        return lazyModel;
    }
   }

这是我的截图类:

@Entity
@XmlRootElement
@Table(name="Test2012", uniqueConstraints = @UniqueConstraint(columnNames = "id"))
public class Screenshot implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "id", columnDefinition="INT")
    private Long id;

    private Timestamp time;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Timestamp getTime() {
        return time;
    }

    public void setTime(Timestamp time) {
        this.time = time;
    }   
}

这是我的 xhtml 代码:

<p:dataTable id="table1" var="scrshot" rowKey="#{scrshot.id}" value="#{screenshotListProducer.lazyModel}" paginator="true" rows="7" paginatorPosition="bottom"
             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
             rowsPerPageTemplate="7,20,50,100" widgetVar="dataTable" currentPageReportTemplate="(Number of Records: {totalRecords})"
             emptyMessage="No screenshot data found with given criteria" lazy="true" scrollable="true" draggableColumns="true" scrollHeight="217" style="width: 100%;"> 
      <f:facet name="header"> 
      </f:facet>
      <p:column selectionMode="multiple"/> 
      <p:column id="time" headerText="Time" sortBy="#{scrshot.time}" filterBy="#{scrshot.time}" filterMatchMode="startsWith"> 
        <h:outputText value="#{scrshot.time}"/> 
      </p:column>   
      <p:column id="id" headerText="ID" sortBy="#{scrshot.id}" filterBy="#{scrshot.id}" filterOptions="#{scrshot.id}" filterMatchMode="exact"> 
        <h:outputText value="#{scrshot.id}"/> 
      </p:column> 
</p:dataTable>

Primefaces 3.3.1 莫哈拉 2.1.5 JBoss AS 7.1.0.Final

【问题讨论】:

    标签: hibernate datatable primefaces lazy-loading filtering


    【解决方案1】:

    几点说明:

    • 您正在使用@RequestScoped。我似乎记得过滤/排序和请求范围的问题(不确定这是这里的问题)。请改用@ViewScoped 或更高的范围。
    • 不要在顶层(支持 bean)中使用数据访问(例如与数据库相关的东西,如 EntityManager)。将其分为 2 层或 3 层:GUI -(业务逻辑)-数据访问。
    • 您发布的ScreenshotListProducer 课程缩进混乱,难以阅读。它似乎也没有正确关闭(缺少“}”)。
    • JSF 中的globalFilter 似乎没有连接到数据表。 (这里我可能错了。)
    • 您似乎要创建 3 个过滤器、2 个列过滤器和 1 个全局过滤器,是哪一个导致了问题?下次更具体;-)
    • 删除不相关的代码并精简代码以制作一个简短的示例来演示您的问题。示例:modeOptionsformatOptions 似乎没有使用,只会影响问题的可读性。

    【讨论】:

    • 我尝试了@ViewScoped,但它似乎并没有改变我的结果。抱歉,缩进混乱等。打字时看起来很好,但提交后就混乱了。我遇到的问题是在完成任何过滤之前加载页面时的初始数据表加载,但在插入示例中概述的过滤代码后会发生这种情况。抱歉,该示例包含的内容超出了所需内容。我试着把它缩短了很多,但有些部分被忽略了。
    • 在添加过滤代码后,我的休眠语句似乎正在尝试“加入”,如果没有添加该代码,我看不到这一点。任何其他建议表示赞赏。感谢您的建议!
    【解决方案2】:

    感谢您的意见。我的加入问题与我的“来自”定义有关。我把它拿出来并在我的过滤器中使用了我原来的“屏幕截图”,它现在可以正确过滤了。

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2022-06-27
      • 2012-08-24
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多