Одна идея может быть:
public <T> T findPeople(SearchRequest request, Class<T> resultClass);
Затем вы можете возвращать разные вещи в зависимости от того, является ли resultClass персоной.class, Long.class или SearchResult.class.
Или, что менее ужасно, вы могли бы сделать:
public <T> T findPeople(SearchRequest request, ResultConverter<T> resultConverter);
Где ResultConverter - это интерфейс, который принимает какой-то необработанный результат поиска и возвращает подходящий преобразованный результат. Вы могли бы иметь готовые экземпляры для обычных:
public class ResultConverters {
public static final ResultConverter<Long> ID;
public static final ResultConverter<Person> PERSON;
public static final ResultConverter<SearchResult> SEARCH_RESULT;
}