在对象模型中有效填充结果集

时间:2010-05-20 08:47:20

标签: data-structures jdbc java-ee

我有一个结构为
的对象模型 仪表板
面板清单
             集装箱清单
             小部件列表
如果我从数据库获得整个仪表板,面板+容器+小部件,则需要多个I / O. 我希望在一个I / O中得到它。为此我准备了一个查询,它给了我这个结果集。

DASHBOARDID PANELID CONTAINERID WIDGETID
13 11 5 2
13 11 5 3
13 11 6 4
13 11 6 5
13 12 7 6
13 12 7 7
13 12 8 8
13 12 8 9

使用列表数据结构可以填充此模型,但是我需要时间来在上面的对象模型中有效地填充此结果集。有没有办法?

2 个答案:

答案 0 :(得分:0)

如果您不严格限制使用JDBC,ORM解决方案可以解决您的问题。例如。在Hibernate中,您可以轻松配置实体映射以使用延迟或预先加载。在后一种情况下,当您加载Dashboard对象时,持久性框架将获取所有包含的面板,容器和小部件,总共1到4个查询(取决于配置 - 请注意,4个表的单个连接查询可能不会如果行数很多,则为最佳),并自动为您初始化整个对象图。

答案 1 :(得分:0)

数据中的严格排序和嵌套使得这相当简单。解决方案是一个查找ID更改的循环 - 当ID更改时,将创建一个新实例。循环的迭代维护当前仪表板,面板,组件,小部件。例如

Dashboard dashboard,
Panel panel;
Container container;
Widget widget;
List<Dashboard> dashboards; 
ResultSet rs = ...;
while (rs.next())
{
   int dashboardID = rs.getInt(1);
   int panelID = rs.getInt(2);
   int dashboardID = rs.getInt(3);
   int dashboardID = rs.getInt(4);

   if (dashboard==null || dashboardID!=dashboard.id()) {
      dashboard = new Dashboard(dashboardID);
      dashboards.add(dashboard);
   }
   if (panel==null || panelID!=panel.id()) {
      panel = new Panel(panelID);
      dashboard.add(panel);
   }
   if (container!=null || containerID!=container.id()) {
      container = new Container(containerID);
      panel.add(container);
   }
   // wimilarly for widget

}
// all dashboards in "dashboards" initialized with hierarchy