在多个联接中使用jdbc获取多个值

时间:2016-02-22 11:04:37

标签: java jdbc

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);
}

这里我们如何确保所有图像都附有正确的相册。

1 个答案:

答案 0 :(得分:0)

处理此问题的最常见方法是订购您的SQL:

 ORDER BY ur.id, al.id, im.image_id

完成后,您知道一个用户的所有相册以及一个相册的所有图片都会连续显示 - 因此您只需切换currentUsercurrentAlbum值,如下所示:

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列表及其AlbumImages已就位。