首页 > 解决方案 > 联表代码简化建议

问题描述

我需要关于我的代码简化的建议。我使用 Struts 2、Spring 和 Hibernate 作为框架。

文件 DAO:

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"]

标签: javaspringhibernatestruts2

解决方案


有两种方法可以映射列名以用于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)返回 an的函数。Object


推荐阅读