dataTable sortBy函数不起作用(primefaces)

时间:2011-03-29 14:17:09

标签: java jsf java-ee jsf-2 primefaces

我遇到了primefaces dataTable组件的问题。我不知道为什么当我点击它时它不会缩短表格中的数据。

<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 sortBy="#{garbage[0].filename}">  
            <f:facet name="header">  
            <h:outputText value="Filename" />  
            </f:facet>  
            <h:outputText value="#{garbage[0]}" />
             </p:column> 

            <p:column>  
            <f:facet name="header">  
            <h:outputText value="Description" />  
            </f:facet>  
            <h:outputText value="#{garbage[1]}" />  
             </p:column> 

            <p:column sortBy="#{garbage[2].uploadDate}">  
            <f:facet name="header">  
            <h:outputText value="Upload date" />  
            </f:facet>  
            <h:outputText value="#{garbage[2]}" /> 
             </p:column>                
    </p:dataTable> 

这是托管bean

@ManagedBean
@RequestScoped
public class ResultsController {

@EJB
private ISearchEJB searchEJB;

private Garbage[] garbage;

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

public Garbage[] getGarbage() {
    System.out.println("VALUES!!!!!!!!" + garbage[0].getFilename());
    return garbage;
}

public void setGarbage(Garbage[] garbage) {
    this.garbage = garbage;
}

}

这是允许数据访问的EJB

@Stateless(name = "ejbs/SearchEJB")

公共类SearchEJB实现了ISearchEJB {

@PersistenceContext
private EntityManager em;


public List<Garbage[]> findAllGarbage() {
    Query query = em.createNamedQuery("findAllGarbage");        
    return  query.getResultList();
}

}

这是实体(数据表示)

@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description,  g.uploadDate FROM Garbage g;")
    @Entity
    public class Garbage {
@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;
...//Getters and Setters

如图所示,点击排序按钮时没有变化: enter image description here

这就是控制台所说的:

  

严重:排序错误

更新

public List<Garbage> findAllGarbage() {
    Query query = em.createNamedQuery("findAllGarbage");    

    List<Garbage> gList = new ArrayList();

    for (Object o: query.getResultList()) {         
      Garbage tmpG = new Garbage();
      tmpG.setFilename(((Garbage) o).getFilename());          
      tmpG.setUploadDate(((Garbage) o).getUploadDate());
      tmpG.setDescription(((Garbage) o).getDescription());

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

修改后的托管bean

@ManagedBean
@RequestScoped
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;
}   

}

修改后的JSF

<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 sortBy="#{garbage.filename}" parser="string">  
            <f:facet name="header">  
            <h:outputText value="Filename" />  
            </f:facet>  
            <h:outputText value="#{garbage.filename}" />
             </p:column> 

            <p:column>  
            <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> 

2 个答案:

答案 0 :(得分:1)

Java EE tutorial我看了以下内容:

  

返回类型

     

SELECT子句的返回类型   由结果类型定义   select中包含的表达式   它。如果使用多个表达式,   查询的结果是   Object []和中的元素   数组对应于的顺序   SELECT子句中的表达式,和   in type到每个的结果类型   表达

现在您的查询如下:

SELECT g.filename, g.description,  g.uploadDate FROM Garbage g;

从您的实体班Garbage我看到filenamedescriptionuploadDate是字符串。然后您的查询返回Object[]列表,每个数组元素包含一个String而不是Garbage对象。

如果您的数组包含字符串而不是垃圾,则无法在facelet中调用garbage[0].filename

尝试按以下方式更改您的查询:

SELECT g FROM Garbage g;

然后你得到List<Garbage>。在SearchEJB中将方法签名更改为以下内容:

public List<Garbage> findAllGarbage()

相应地更改ResultsController托管bean中的方法(现在您始终需要List<Garbage>而不是List<Garbage[]>)。

最后修改您的p:dataTable(显示在第一列):

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

<强>更新

如果您想保留查询,可以将Object[]转换为Garbage个对象列表,并将缺少的字段留空。像这样的东西(给你的Garbage类添加一个构造函数):

List<Garbage> gList = new ArrayList();

for (Object[] o: query.getResultList()) {
  gList.add(new Garbage(o[0], o[1], o[2]);
}

更新2:

在您的更新中,您再次错过了,您的数组包含字符串。当你的select表达式被排序时,字符串是有序的:元素0:文件名,元素1:描述,元素2:uploadDate。

按以下方式更改循环:

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

      gList.add(tmpG);
    }

答案 1 :(得分:0)

我知道这是3年前被问到的,但我会给你解决方案以防万一有人偶然发现这个问题。

基本上需要做的是在构造函数中为数据调用findAll()方法。但是由于EJB外观是在构造后注入的,所以不能在构造函数中调用findAllGarbage()方法。您可以在注释的方法中执行此操作 @PostConstruct:

@PostConstruct
public void myInitMethod(){
   garbage = searchEJB.findAllGarbage();
}

另外:在getter中调用findAllGarbage()方法会重置数据,sort函数也不会产生任何影响。因此,可以从getter中删除该方法并将findAll逻辑移动到其他位置,例如在向表中添加数据的情况下按钮操作。

有关EJB注入的更多信息,请访问:ejbFacade is null