如何使一个值的外键显示在primefaces数据表中

How to make foreign keys of a value be displayed in primefaces datatable

我有一个 primefaces data-table,其中一列的值是一个外键,我想显示附加到另一个数据库中的外键的值 table 以显示在数据的那一列中-table.

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>

在此数据中table 第三列值即“#{issues.issueType}”是一个外键,我希望在另一个 table 中具有与此关联的值显示在那个地方。

我尝试使用另一个 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 传递或什至设置时,列表将被最后一条记录填充。 请协助我解决这个问题,有什么简单的方法可以解决这个问题吗?

您并不是在每次迭代期间都创建新的 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) 调用都非常低效。只拿一次。