Just had a minor suggestion to toss out there: consider using Deque instead if List as the collection used by fetch operations.
Deque offers iteration (in either direction) but not the random access of get(int index). I don't think random access is useful for result sets since you're not generally going to know what a given index will give you. ArrayDeque is more efficient in both interation performance and memory usage.
