Я сталкиваюсь с проблемой с упругостью данных, когда сортировка применяется только к экземплярам в реализациях сущностей, а не ко всему набору результатов.
Сущность:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "Entity_Type")
public abstract class BaseEntity implements Identifiable<Long> {
public Long getId();
@ManyToOne
RelatedEntity related;
}
@Entity
@DiscriminatorValue("Entity1")
public class Entity1 extends BaseEntity { }
@Entity
@DiscriminatorValue("Entity2")
public class Entity2 extends BaseEntity { }
Хранилища:
@NoRepositoryBean
public interface AbstractEntityRepository<T extends BaseEntity> extends PagingAndSortingRepository<T, Long> {
List<T> findByRelatedEntityId(@Param("id") Long id, Sort sort);
}
@RepositoryRestResource
public interface BaseEntityRepository extends AbstractEntityRepository<BaseEntity> { }
+ repository for each "T extends BaseEntity"
Теперь проблема:
метод поиска baseEntityRepository/search/findByRelatedEntity?id=...
с указанием &sort=id,asc
или &sort=id,desc
правильно упорядочивает сущности в пределах «групп» сущностей, но порядок «групп» сущностей представлен произвольным образом. Произвольный порядок кажется другим для findAll
, но трудно подтвердить, не зная, что именно происходит. Пример вывода:
Примеры:
рода = идентификатор, по возрастанию
{
"_embedded": {
"entity1s": [ "id": 1... ],
"entity2s": [ "id": 3... ],
"entity3s": [ "id": 2,10,20,... ], <--- illustrates order is correct within group
"entity4s": [ "id": 4... ]
}
}
рода = идентификатор, убывание
{
"_embedded": {
"entity4s": [ "id": 4... ],
"entity1s": [ "id": 1... ],
"entity3s": [ "id": 20,10,2... ], <--- illustrates order is correct within group
"entity2s": [ "id": 3]
}
}
Вопросы:
1 - Как "группы" называются в данных покоя весной?
2 - В чем причина произвольного порядка? Почему entity3s
(самый низкий ID = 2) не предшествует entity2s
(самый низкий ID = 3) в первом примере?
3 - Могу ли я получить объекты, отсортированные по идентификатору, даже если они перепутали объекты?
4 - Для findAll
, почему результат отличается для нумерации страниц (первые 20 записей) и полного вывода? (&size=1000
)