我遇到了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
如图所示,点击排序按钮时没有变化:
这就是控制台所说的:
严重:排序错误
更新
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>
答案 0 :(得分:1)
从Java EE tutorial我看了以下内容:
返回类型
SELECT子句的返回类型 由结果类型定义 select中包含的表达式 它。如果使用多个表达式, 查询的结果是 Object []和中的元素 数组对应于的顺序 SELECT子句中的表达式,和 in type到每个的结果类型 表达
现在您的查询如下:
SELECT g.filename, g.description, g.uploadDate FROM Garbage g;
从您的实体班Garbage
我看到filename
,description
,uploadDate
是字符串。然后您的查询返回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