В качестве альтернативы вас может заинтересовать faceting , которая пытается решить ту же проблему, но не затрагивает проблему заказа.
Если вы действительно хотите группировать.... вы, кажется, знаете об этом, но вам нужно будет выполнить некоторую постобработку ваших данных.
Что-то вроде:
List<Shop> shops = fullTextQuery.getResultList();
Map<Supermarket, List<Shop>> results =
shops.stream().collect( Collectors.groupingBy( Shop::getSupermarket, LinkedHashMap::new, Collectors.toList() ) ;
Теперь о заказе ... Этозависит от того, что вы хотите.Предполагая, что ваши результаты разбиты на страницы, если магазин супермаркета 1 ранее был на странице 2, хотите ли вы, чтобы он отображался на странице 1 независимо от его расстояния?Т.е. вы хотите отсортировать сначала по супермаркету, а затем по расстоянию?Если это так, просто сделайте это:
Sort sort = new Sort(
new SortField("superMarket.id", SortField.Type.STRING, true),
new DistanceSortField(lat, lng, "location")
);
query.setSort(sort);
Или вы хотите, чтобы он оставался на второй странице и потенциально мог один и тот же супермаркет появляться на нескольких страницах?Если это так, используйте тот же тип, который вы указали в своем вопросе:
Sort sort = new Sort(
new DistanceSortField(lat, lng, "location"),
new SortField("superMarket.id", SortField.Type.STRING, true));
query.setSort(sort);