ps = con.prepareStatement(
"select distinct ur.*,al.*,im.* from user as ur "
+ "left join album as al "
+ "on ur.id=al.aid "
+ "left join images as im "
+ "on al.id=im.album_id ");
此处一位用户可以拥有多张专辑,每张专辑可以有多张图片。 我想从ablove查询中获取所有数据。 我写了以下代码
List<User> uList=new ArrayList<User>();
while (rs.next()) {
User u = new User(rs.getLong("ur.id"), rs.getString("ur.fname"), rs.getString("ur.lname"), null);
Album al = new Album(rs.getLong("al.id"), rs.getString("al.name"));
Images pi = new Images(rs.getLong("im.image_id"), rs.getString("im.img_desc"), rs.getString("im.sm_pic_path"));
Set<Images> piSet = new HashSet<Images>();
piSet.add(pi);
al.setImages(piSet);
Set<Album> alSet = new HashSet<Album>();
alSet.add(al);
u.setAlbums(alSet);
uList.add(u);
}
这里我们如何确保所有图像都附有正确的相册。
答案 0 :(得分:0)
处理此问题的最常见方法是订购您的SQL:
ORDER BY ur.id, al.id, im.image_id
完成后,您知道一个用户的所有相册以及一个相册的所有图片都会连续显示 - 因此您只需切换currentUser
和currentAlbum
值,如下所示:
User curentUser = new User(-1); //User with ID -1
Album currentAlbum = new Album (-1); //Album with ID -1
List<User> users = new ArrayList<User>(); //List of all users
while(rs.next()) {
User u = new User(rs.getLong("ur.id"), rs.getString("ur.fname"), rs.getString("ur.lname"), null);
//CurrentUser has changed!
if(u.getId() != currentUser.getId()) {
currentUser = u;
//Add to list of users
users.add(u);
}
Album al = new Album(rs.getLong("al.id"), rs.getString("al.name"));
//Current Album has changed?
if(currentAlbum.getId() != al.getId()) {
currentAlbum = al;
//Add this as album to user
currentUser.addAlbum(al);
}
Images pi = new Images(rs.getLong("im.image_id"), rs.getString("im.img_desc"), rs.getString("im.sm_pic_path"));
//Add this image to currentAlbum
currentAlbum.addImage(pi);
}
您的Set<Images>
需要成为Album
的成员,并且您的Set<Album>
需要成为User
的成员才能发挥作用 - 但之后您会得到一个面向精细对象的User
s列表及其Album
和Images
已就位。