关于联合表代码简化的建议



我需要一些简化代码的建议。我使用struts2, Spring和Hibernate作为框架。

文件道:

public List<Model> getData() throws HibernateException {
List<Model> list = new ArrayList<Model>();
List<Object[]> res = new ArrayList<Object[]>();
String query = "SELECT table1.*, table2.* FROM table1, table2 WHERE table1.bridge_id = table2.bridge_id";
res = this.sessionFactory.getCurrentSession()
.createSQLQuery(query)
.list();
for (Object[] row : res) {
Model model = new Model();
model.setName((String) row[1]);
model.setDate((Date) row[2]);
list.add(model);
}
return list;
}

我试着使用

while(res.next()){ ... }

next()在我的项目中不是功能,就像我使用size()来计数列表的大小,而不是数组的length

出于某种原因,我不喜欢使用row[0]在循环中定义函数值,我想要的是将值定义为row["name"]

有两种可能的方法将列名映射到仅包含值的行数据Object[]

  1. 将列名映射到索引
Map<String, int> map = new HashMap<>()
map.put("name", 0); 
map.put("date", 1);
for (Object[] row : res) {
Model model = new Model();
model.setName((String) row[map.get("name")]);
model.setDate((Date) row[map.get("date")]);
list.add(model);
}
  1. Object[]映射到Map<String, Object>,并使用之前的映射
Map<String, int> map = new HashMap<>()
map.put("name", 0); 
map.put("date", 1);

for (Object[] row : res) {
Model model = new Model();
Map<String, Object> map2 = new HashMap<>();
map2.put("name", row[map.get("name")]);
map2.put("date", row[map.get("date")]
model.setName((String) map2.get("name"));
model.setDate((Date) map2.get("date"));
list.add(model);
}

您可以为row创建一个包含两个映射的适配器类。适配器将Object[]作为构造函数参数。然后使用函数getValue(String)返回第二个映射的Object

最新更新