27a28 > import java.util.Collection; 78a80 > private static final int LOAD_ROSTER_ITEM_GROUPS_CHUNK_SIZE = 1000; 270,281c272,291 < StringBuilder sb = new StringBuilder(100); < sb.append(LOAD_ROSTER_ITEM_GROUPS).append(" WHERE rosterID IN ("); < for (RosterItem item : itemList) { < sb.append(item.getID()).append(","); < } < sb.setLength(sb.length()-1); < sb.append(") ORDER BY rosterID, rank"); < pstmt = con.prepareStatement(sb.toString()); < rs = pstmt.executeQuery(); < while (rs.next()) { < itemsByID.get(rs.getLong(1)).getGroups().add(rs.getString(2)); < } --- > > // If we have more than 1000 groups in our roster, we will issue multiple selects > // to avoid being hit by database limits such as ORA-1795, which limits IN clauses to > // 1,000 terms > int numberOfChunks = (itemList.size()+LOAD_ROSTER_ITEM_GROUPS_CHUNK_SIZE-1)/LOAD_ROSTER_ITEM_GROUPS_CHUNK_SIZE; //Round-up the number of chunks > for (int chunk=0; chunk < numberOfChunks; chunk++) { > StringBuilder sb = new StringBuilder(100); > sb.append(LOAD_ROSTER_ITEM_GROUPS).append(" WHERE rosterID IN ("); > for (int idxInChunk=0; idxInChunk RosterItem item = itemList.get(idxInChunk+chunk*LOAD_ROSTER_ITEM_GROUPS_CHUNK_SIZE); > sb.append(item.getID()).append(","); > } > sb.setLength(sb.length()-1); > sb.append(") ORDER BY rosterID, rank"); > pstmt = con.prepareStatement(sb.toString()); > rs = pstmt.executeQuery(); > while (rs.next()) { > itemsByID.get(rs.getLong(1)).getGroups().add(rs.getString(2)); > } > }