2016-04-15 58 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); 
}