如何使值的外键显示在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数据表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql中使用2个以上的外键显示数据?

如何通过 Laravel 中的外键检索数据?

如何显示来自另一个表的列数据而不是数据表的外键数据

可以保存重复值的外键

在 MS-Access 中,当外键不再存在时,如何在组合框中显示旧的外键?

具有默认值的外键上的 Django 1.7 迁移错误