在Java中 - 如何将resultSet映射到复杂对象?

时间:2015-01-29 18:34:27

标签: java arrays json jdbc mapping

如何将结果集从几个表映射到复杂对象? 让我详细说明:

假设我有这两个类:

public class User {
    private int user_id;
    private String fname;
    private String lname;
    //getters setters...
}

public class Country{
    private String country;
    private ArrayList<User> users;
    }

sql查询:

SELECT * FROM users U,Country C WHERE c.user_id = U.id

给我以下输出 -

id | fname | lname| country 
1  | Jack  | Levi |  USA
1  | Jack  | Levi |  UK
2  | Mike  | Brown|  Germany

如何将这些结果映射到Country类? 我需要从它创建一个Json字符串来得到这样的东西:

{
id : 1,
fname: "jack",
lname" "levi",
countries : {"USA", "UK"}
}

非常感谢!!

4 个答案:

答案 0 :(得分:1)

创建一个HashMap,其中user id是键,user是值。然后在处理结果集时,执行map.get(resultset.get(userid)),如果它为null,则创建一个新用户,但如果它不是,则执行逻辑以附加用户到了这个国家。

HashMap<Integer, User> users;
HashMap<String, Country> countries;
//inside the result set processing
User u = users.get(resultSet.get("id"));
    if(null != u) {
      //populate user here
    } else {
       Country c = countries.get(resultSet.get(country);
       c.users.add(u);
    }

答案 1 :(得分:0)

当使用springframework的jdbcTemplate时,实现RowMapper接口是一个好方法。

答案 2 :(得分:0)

也许尝试这样的事情:

ArrayList<User> users = new ArrayList<User>();
while(resultSet.next)
{
     users.add(new User(resultSet.getString("id"), resultSet.getString("fname"), resultSet.getString("lname"));
     //you can also add your countries to an array list
}

答案 3 :(得分:0)

ORM库确实希望您描述。虽然大多数人可能会执行2次查询而不是连接。通常,您需要在列表字段上提供某种注释,以便它知道如何执行查询:

public class Country{
  private String country;

  @OneToMany(...)
  private ArrayList<User> users;
}

当您选择Country对象时,ORM会选择所有相关的User对象并将它们添加到用户ArrayList中。

我使用的库是sormula(我是作者)。请参阅one to many example。如果User类中的外键与Country类中的主键同名,则不需要注释。

此页面提供了有关JPA OneToMany注释的详细信息:en.wikibooks.org/wiki/Java_Persistence/OneToMany