如何使值的外键显示在primefaces数据表中
Posted
技术标签:
【中文标题】如何使值的外键显示在primefaces数据表中【英文标题】:How to make foreign keys of a value be displayed in primefaces datatable 【发布时间】:2015-07-10 06:32:24 【问题描述】:我有一个 primefaces 数据表,其中一列的值是外键,我想在另一个数据库表中显示附加到外键的值,以显示在数据表的该列中。
issue.xhtml
<p:dataTable id="dataTable" var="issues" value="#displayIssuesBean.issues"
scrollable="true" style="width:1000px;" emptyMessage="#msg['prometheus_issuesdisplayemptymessage']">
<f:facet name="header">#msg['prometheus_issues']</f:facet>
<p:column headerText="#msg['prometheus_number']">
<h:outputText value="#issues.id" />
</p:column>
<p:column headerText="#msg['prometheus_title']">
<h:outputText value="#issues.issueTitle" />
</p:column>
<p:column headerText="#msg['prometheus_type']">
<h:outputText value="#issues.issueType" />
</p:column>
<p:column headerText="#msg['prometheus_estimatedtime']">
<h:outputText value="#issues.estimationTime" />
</p:column>
</p:dataTable>
在此数据表中,第三列值,即“#issues.issueType”是一个外键,我希望在另一个表中与此关联的值显示在该位置。
我尝试使用另一个 DTO 设置值以及缺少的属性,并尝试设置值并再次获取但没有得到选择的结果。
豆码
public List<IssueDisplayDTO> getIssueDataToForm(List<IssueDBDTO> list)
for (int i = 0; i < list.size(); i++)
issueDisplayDTO.setIssueNumber(list.get(i).getId());
issueDisplayDTO.setIssueType(setIssueTypeWithIssueTypeId(list.get(i).getId()));
issueDisplayDTO.setTitle(list.get(i).getIssueTitle());
issueDisplayDTO.setEstimatedTime(list.get(i).getEstimationTime());
modifiedList.add(issueDisplayDTO);
return modifiedList;
private String setIssueTypeWithIssueTypeId(int issueTypeId)
String type=null;
if (issueTypeId == 1)
type="Bug";
else if (issueTypeId == 2)
type="Story";
else if (issueTypeId == 3)
type="Task";
return type;
使用上面的代码 modifiedList 保持值直到 for 循环持续,但是当传递或什至使用 setter 和 getter 设置时,列表被最后一条记录填充。 请在这个问题上帮助我,有什么简单的方法可以解决这个问题吗?
【问题讨论】:
【参考方案1】:您不会在每次迭代期间创建新的 issueDisplayDTO
实例。相反,您重用了同一个实例,并且只在每次迭代期间更改其属性。因此,列表中所有添加的条目显然都将引用一个相同的 issueDisplayDTO
实例,该实例具有在最后一轮迭代期间设置的属性。
您应该在每次迭代期间创建一个新的。
for (int i = 0; i < list.size(); i++)
IssueDBDTO issueDisplayDTO = new IssueDBDTO(); // Here.
issueDisplayDTO.setIssueNumber(list.get(i).getId());
// ...
modifiedList.add(issueDisplayDTO);
这个问题与 mysql、FK 关系无关,更不用说 JSF/PrimeFaces 了。这只是基本的Java。在使用 main()
方法在普通 Java 应用程序中重新创建问题并使用 System.out.println()
而不是整个 JSF 网页呈现问题时,您会遇到完全相同的问题。
与具体问题无关,请考虑使用enum
而不是int
。而且,每次调用list.get(i)
确实效率很低。只掌握一次。
【讨论】:
以上是关于如何使值的外键显示在primefaces数据表中的主要内容,如果未能解决你的问题,请参考以下文章