我需要一些简化代码的建议。我使用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[]
。
- 将列名映射到索引
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);
}
- 将
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
。