2012-12-09 98 views
0

我试图在我的应用程序中实现延迟加载,但遇到了我的筛选问题。排序在这一点上正常工作。使用惰性过滤时,数据表最初将从24个记录的表中加载正确的计数,但它会一遍又一遍地重复第1个和第2个记录。任何帮助是极大的赞赏。Primefaces懒惰筛选问题

这里是我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

回答

0

感谢您的意见。我的加入问题与我的'From'定义有关。我把它拿出来,在我的过滤器中使用我原来的'截图',它现在过滤正确。

1

一对夫妇的言论:

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

我试过@ViewScoped,它没有改变我的结果。对不起,缩进等等。打字时看起来很不错,但在提交后很混乱。在进行任何过滤之前加载页面时,我遇到的问题是在初始数据加载时发生的,但是在插入示例中列出的过滤代码后发生这种情况。很抱歉,该示例包含的内容超过了所需内容。我试图缩短它,但是有些作品被忽略了。 – user1530469

+0

看来我的hibernate语句在添加过滤代码之后尝试执行“连接”,并且没有添加该代码,我没有看到它。任何其他建议表示赞赏。感谢您的建议! – user1530469