2011-03-30 141 views
1

我不知道爲什麼我點擊排序箭頭時,我的dataTable不排序列。它只在我第一次在過濾器上輸入某些東西並刪除它時才起作用(這就像它需要在過濾器上至少有一個字符能夠正確排序)。dataTable排序問題(JSF2.0 + primefaces)

我會粘貼在這裏的代碼:

這是DataTable中

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:t="http://myfaces.apache.org/tomahawk" 
xmlns:p="http://primefaces.prime.com.tr/ui"> 
    <ui:composition template="WEB-INF/templates/BasicTemplate.xhtml"> 
<ui:define name="resultsForm"> 
<h:form enctype="multipart/form-data"> 
    <h:inputText id="search" value="" /><h:commandButton value="search"/> 

    <p:dataTable var="garbage" value="#{resultsController.allGarbage}" dynamic="true" paginator="true" paginatorPosition="bottom" rows="10" 
      paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
      rowsPerPageTemplate="5,10,15">   

      <p:column filterBy="#{garbage.filename}" filterMatchMode="startsWith" sortBy="#{garbage.filename}" parser="string"> 
      <f:facet name="header"> 
      <h:outputText value="Filename" /> 
      </f:facet> 
      <h:outputText value="#{garbage.filename}" /> 
      </p:column> 

      <p:column filterBy="#{garbage.description}" filterMatchMode="contains"> 
      <f:facet name="header"> 
      <h:outputText value="Description" /> 
      </f:facet> 
      <h:outputText value="#{garbage.description}" /> 
      </p:column> 

      <p:column sortBy="#{garbage.uploadDate}" parser="string"> 
      <f:facet name="header"> 
      <h:outputText value="Upload date" /> 
      </f:facet> 
      <h:outputText value="#{garbage.uploadDate}" /> 
      </p:column>     
    </p:dataTable> 
</h:form> 
</ui:define> 

這裏的託管Bean與該頁面交互的JSF頁面:

@ManagedBean 
@ViewScoped implements Serializable 
public class ResultsController { 

@EJB 
private ISearchEJB searchEJB; 

private Garbage garbage; 

public List<Garbage> getAllGarbage() { 
    return searchEJB.findAllGarbage(); 
} 

public Garbage getGarbage() { 
    return garbage; 
} 

public void setGarbage(Garbage garbage) { 
    this.garbage = garbage; 
} 
使用

@Stateless(name = "ejbs/SearchEJB") 
public class SearchEJB implements ISearchEJB { 

@PersistenceContext 
private EntityManager em; 
public List<Garbage> findAllGarbage() { 
    Query query = em.createNamedQuery("findAllGarbage"); 
    List<Garbage> gList = new ArrayList<Garbage>(); 

    for (Object o : query.getResultList()) { 
     Object[] cols = (Object[]) o; 
     Garbage tmpG = new Garbage(); 
     tmpG.setFilename(cols[0].toString()); 
     tmpG.setDescription(cols[1].toString()); 
     tmpG.setUploadDate(cols[2].toString()); 

     gList.add(tmpG); 
    } 
    return gList; 
} 

}

與JPQL命名查詢實體:

訪問數據庫的EJB

@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description, g.uploadDate FROM Garbage g;") 
    @Entity 
    public class Garbage implements Serializable{ 

@Id 
@GeneratedValue 
@Column(nullable = false) 
private Long id; 
@Column(nullable = false) 
private String filename; 
@Column(nullable = false) 
private String fileType; 
@Column(nullable = false) 
private String uploadDate; 
@Column(nullable = false) 
private String destroyDate; 
@Lob 
@Column(nullable = false) 
private byte[] file; 
@Column(nullable = false) 
private String description; 

打印屏幕與瀏覽器輸出

enter image description here

回答

2

我想確認我遇到了與primefaces-2.2.1中描述的完全相同的問題。

我的dataTable的值(行元素)是從查詢中計算出來的。

對一個簡單的名字進行排序字符串屬性失敗,除非我也有一個filterBy,即使這樣它只有在我至少輸入一個字母進入過濾器框時才起作用。然後我可以在篩選結果中按升序/降序排序。

Webel

+1

此外,我僅在頁面加載時使用)測試了初始化列表,並且問題仍然存在,但該策略確保p:dataTable的其他特性,例如內聯cellEditor現在可以正常工作(如http://stackoverflow.com/questions/6365877/cell-edit-in-primefaces-is-not-updating-the-value中所述/ 6889504#6889504)。我認爲我們遇到了一個真正的bug,而不是濫用p:dataTable。 – 2011-07-31 12:39:53

+0

我從來沒有修復那個。可能正如你所說我們正面臨一個錯誤,也許有不同版本的primefaces,情況就不同了。我仍然不知道如何解決它。 – sfrj 2011-07-31 13:04:16

3

我的經驗因此,primefaces支持bean(ViewScoped!)必須擁有它自己的行列表。因此,例如,如果每次請求p:dataTable時查詢數據庫:值排序都不起作用。解決方案:從數據庫收集列表,並將其保存在輔助bean的本地List變量中。

在你的代碼提供

public List<Garbage> getAllGarbage() { 
    return searchEJB.findAllGarbage(); 
} 

你在每次請求的列表。它沒有按照設計工作。希望有所幫助。

+0

那麼你認爲是什麼就是缺少會多一個列表,局部變量來交換內存或類似的東西作用?我現在會嘗試。我將添加列表 allGarbage;到我的代碼。 – sfrj 2011-04-04 17:58:54

+0

我只是試圖添加變量List allGarbage;到我的託管bean,如你所說,但它仍然沒有正確排序(我的意思是一次)。 – sfrj 2011-04-04 18:04:29

+0

是否所有垃圾都懶於初始化?也許代碼... 當你完全刪除過濾器的東西時,它是否都能像預期的那樣工作? – alfonx 2011-04-05 08:47:12

1

添加答案不是因爲長

更新到前面的回答發表評論:Primefaces 3.5似乎已經解決了這個號碼:我彙報了2.2.1和仍是一個DataTable sortBy問題問題在3.3。

但是,在Mac OS X上,p:dataTable只能在某些Max OS X版本的某些Firefox版本上正常工作。

在Mac OS X 10.6.8上的Firefox 20.0上仍然可用(兩者仍支持)。

在Mac OS X 10.5.8(也是行尾)上,Firefox 16.0.2(行尾)存在一些非常奇怪的問題,例如出現在筆,剔,交叉處的編輯圖標並且行編輯根本不會激活,排序圖標不會出現,並且在對列標題進行排序時爆炸並重復奇怪地偏移到所有列標題的右側。在Mac OS X 10.5.8上,行編輯在Firefox 16.0.2上的Primefaces 3.3上運行良好(行尾)。

在Mac OS X 10.5.8行編輯和sortBy在Safari 5.0.6和Chrome 21.0.1180.90上都可以。

這些測試是對Glassfish 3.1.1(在Netbeans7.1中)執行的。 Primefaces 3.3

http://code.google.com/p/primefaces/issues/detail?id=2476

http://forum.primefaces.org/viewtopic.php?f=3&t=14845

http://forum.primefaces.org/viewtopic.php?f=3&t=14838

+0

是的,我過去經歷過類似的問題。這是我之前添加的一個問題,但我認爲現在新版本的primefraces這個問題可能已經消失了。從那以後我沒有嘗試過。 我會給你+1的研究。 Tnx – sfrj 2013-04-08 18:53:21

+0

這裏有一個新的Sample實體p:dataTable測試套件的相關問題的詳細討論: http://forum.primefaces.org/viewtopic.php?f=3&t=29893 p:dataTable:test suite :按照每個視圖排序很多表格 – 2013-04-22 07:19:25