2016-04-15 55 views
2

我试图获取专辑细节,并与专辑相关的设置piSet所有图像,但它不是取所有图像设置piSet读取多联接数据集合

我要像

albumname in al object  
    ABC 
    images in piSet 
       image1 
       image2 
       image3 
       .... 

数据获取代码是

con = ConnectionFactory.getConnection(); 
        List<Album> aList = new ArrayList<Album>(); 
        try { 
         ps = con.prepareStatement("select distinct album.*,pi.* from " 
           + "atom as a " 
           + "left join album as album " 
           + "on " 
           + "a.id=album.aid " 
           + "left join post_images as pi " 
           + "on " 
           + "album.id=pi.album_id " 
           + "where " 
           + "a.id=? " 
           + "and a.status=? "); 
         ps.setLong(1, aid); 
         ps.setString(2, "Active"); 
         rs = ps.executeQuery(); 

         while (rs.next()) { 
          Set<PostImages> piSet = new HashSet<PostImages>(); 
          Album al = new Album(); 
          al.setId(rs.getLong("album.id")); 
          al.setName(rs.getString("album.name")); 
          PostImages pi = new PostImages(); 
          pi.setImageId(rs.getLong("pi.image_id")); 
            pi.setLargePicPath(rs.getString("pi.large_pic_path")); 

          piSet.add(pi); 
          al.setPostImageses(piSet); 
          aList.add(al); 
         } 
        } catch (SQLException e) {} 

如何修改上述代码以将所有图像提取到'PiSet'。

回答

0

您需要保留一个从id到Album实例的映射,并且只在给定id没有实例时才创建新的Album

我还建议你让Album在内部处理Set,只是将图像添加到相册中,而不是将其设置为相册。

Map<Long, Album> albumMap = new HashMapMap<>(); 
while (rs.next()) { 
    long albumId = rs.getLong("album.id"); 
    Album album = albumMap.get(albumId); 
    if (albumId = null) { 
     album = new Album(); 
     album.setId(albumId); 
     album.setName(rs.getString("album.name")); 
     albumMap.put(albumId, album); 
    ) 
    PostImages pi = new PostImages(); 
    pi.setImageId(rs.getLong("pi.image_id")); 
    pi.setLargePicPath(rs.getString("pi.large_pic_path")); 

    // Don't handle the set yourself, let Album handle it. 
    album.addPostImage(pi); 
} 
aList.addAll(albumMap.values()); 

顺便说一句:在ResultSet.getXXX使用表前缀不是JDBC标准是 - 据我所知 - MySQL的具体的;它会使您的代码在不同数据库之间的移植性降低。

2

假设ID专辑台独一无二的,上面的代码能满足您的要求:

rs = ps.executeQuery(); 
HashMap<Long, Album> AlbumMap = new HashMap<Long, Album>(); 
while (rs.next()) { 
    Long albumId = rs.getLong("album.id");//assume album.id is unique. 
    Album al = AlbumMap.get(albumId); 
    if (al == null) { 
     al = new Album(); 
     al.setId(albumId); 
     al.setName(rs.getString("album.name")); 
     Set<PostImages> piSet = new HashSet<PostImages>(); 
     al.setPostImageses(piSet); 
     aList.add(al); 
     AlbumMap.put(albumId, al); 
    } 
    PostImages pi = new PostImages(); 
    pi.setImageId(rs.getLong("pi.image_id")); 
      pi.setLargePicPath(rs.getString("pi.large_pic_path")); 
    al.getPostImageses().add(pi); 
}