如何将结果集从几个表映射到复杂对象? 让我详细说明:
假设我有这两个类:
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"}
}
非常感谢!!
答案 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