【问题标题】:How to Join data from 2 different tables in a single JTable如何在单个 JTable 中连接来自 2 个不同表的数据
【发布时间】:2019-05-17 08:32:53
【问题描述】:

我正在为员工管理系统制作程序.. 现在我正在制作员工注册的 CRUD 表单,我在数据层、业务逻辑和 gui 中分离了 src 代码。在 gui 中我分离了 gui 视图和 gui 模型,在Gui 模型我创建了一个 EmployeeTableModel 来指定我想如何显示员工表的数据,但是在那个表中我得到了来自多个表的数据,一个是数据库中的 Employee 表,另一个是 Phone .. 我已经成功获得Employee Table 中的数据,我可以将这些数据放在数据库中的 Employee Table 和 Phone 表中,但我无法将它们放入 TableModel,我只能从员工那里获取数据。

PHOTO OF THE TABLE

ALL SOURCE CODE HERE - GIT

我尝试更改 EmployeeTableModel 中的代码以接受更多列并设法从电话表中添​​加数据,但没有奏效,因为每个员工都有 2 个 -3 电话号码并且 Employee_ID 被指定为外国电话表上的键..正如我所说,每个员工都有 3 部电话,当我们指定要获取哪部电话时,它取决于电话表中的外键 employee_id。

public class PunetoriTableModel extends AbstractTableModel {

List<Punetori> list;
TelefoniRepository tr = new TelefoniRepository();
PunetoriRepository pr = new PunetoriRepository();

String[] cols = {"Nr.", "Nr-Departmentit", "Emri", "Mbiemri", "Email", "Qyteti","Adresa","tel1","tel2"};

public PunetoriTableModel() {
}

public PunetoriTableModel(List<Punetori> list) {
    this.list = list;
}

public void addList(List<Punetori> list) {
    this.list = list;
}

@Override
public String getColumnName(int col) {
    return cols[col];
}

@Override
public int getRowCount() {
    return list.size();
}

public void remove(int row) {
    list.remove(row);
}

public Punetori getPersoni(int index) {
    return list.get(index);
}

@Override
public int getColumnCount() {
    return cols.length;
}

public String getDateToString(Date d) {
    DateFormat da = new SimpleDateFormat("dd-MM-yyyy");
    return da.format(d);

}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
     Punetori p = list.get(rowIndex) ;


        switch (columnIndex) {
            case 0:
                return p.getPunetoriID();
            case 1:
                return p.getDepartmentiId();
            case 2:
                return p.getEmri();
            case 3:
                return p.getMbiemri();
            case 4:
                return p.getEmail();
            case 5:
                return p.getQyteti();
            case 6:
                return p.getAdresa();




            default:
                return null;
        }
    }
}

【问题讨论】:

  • 如果员工有 3 部手机,您需要 3 列(显示每部手机)以及员工和他的手机之间的对象映射(因此您的 Employee 类具有类似 List&lt;String&gt; getPhones(); 的方法)。
  • 请输入数据类和代码如何从数据库中检索它们。 (您在使用 JPA 吗?)我们无法真正理解您的问题到底是什么。
  • 我正在使用 JPA,并且我为数据库 {Entity Classes} 生成的每个表创建了一个接口和存储库类,在接口中我有 CRUD 操作的方法,在存储库中我使用实现它们jpa 实体管理器。

标签: java swing join jtable tablemodel


【解决方案1】:

首先决定你的专栏将是什么。当一些员工拥有不止一部电话时,您似乎对这些列应该是什么感到困惑。目前尚不清楚您的问题是什么,但可能只是将其画在一张纸上就已经让您的头脑清醒了。

还要确定这些列是固定的还是动态的(即是否可以为某些员工获取更多列,您需要添加到表中?)

其次,创建一个单独的数据结构,让我们调用这个类EmployeeData,它捕获你想要的信息。将此与PunetoriTableModel 分开。从您的数据存储库中填充它。 在其中放置了必要的逻辑来决定使用哪部手机,或者您需要的任何自定义业务逻辑。

使EmployeeData 提供一些公共方法,如getColumns()getRowCount()getRow(int i) 等。

PunetoriTableModel 的构造函数中,只需传递 EmployeeData 并在各自的方法中调用 EmployeeData 。这样,表格模型将数据视为表格,并且您拥有自定义逻辑,可将不同表格中的数据组合成一个单独的表格。

【讨论】:

  • Sergiy Medvynskyy 和 jbx,感谢您的回答。。更具体地说,我有 EmployeeTableModel(PersoniTableModel),其中包含来自数据库中 Employee 表的所有数据,但问题是我不能在 [case 块] 中调用这些属性,因为首先应该指定我正在为哪个员工 ID 调用该方法.. example:case 7:{ return t.getTel1();案例 8:返回 t.tel2(); }
  • @ValonJanuzaj 你没有提供你的数据类,所以我们不能真正理解你的问题是什么。但是,这就是为什么我建议在执行此操作的特定类中抽象您的逻辑。我假设如果您知道您的第 1 行员工的 id 为 123,那么您可以通过获取员工 ID 123 的电话号码来获取第 1 行的电话号码。
  • 来吧兄弟,因为我无法添加所有代码bitbucket.org/vj40639/emp_repository_/src@jbx
  • @ValonJanuzaj 你的Punetori 类有一个telefoniCollection。因此,您可以执行p.getTelefoniCollection() 以在行中为您的员工获取Telefoni 的列表,并将它们放在右列中。看不出你的问题是什么。
  • 是的,兄弟,它有 getTelefoniCollection,如果我调用它,即使我在 Phone 表中有数据,并且有 Employe_id 的外键,我仍然会得到一个空指针异常,但即使我获取这些数据,我应该如何将它们放入 TableModel 中。我是 java 初学者,所以不要生我的气兄弟:P 顺便说一句,非常感谢你
猜你喜欢
  • 2019-03-09
  • 2013-11-11
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2022-11-20
  • 2017-10-21
相关资源
最近更新 更多