Сортировать по общему количеству дочерних списков с помощью JpaRepository Spring-data-jpa - PullRequest
0 голосов
/ 30 октября 2018

У меня есть требование подкачки и сортировки сущности.

@Entity
@Table(name = "CATEGORY", catalog = "")
public class CategoryEntity {
 private CategoryEntity categoryByParentCategoryId;
 private Set<CategoryEntity> categoriesByCategoryId;


@ManyToOne(fetch = FetchType.LAZY,optional = false, cascade = CascadeType.PERSIST)
@JoinColumn(name = "PARENT_CATEGORY_ID", referencedColumnName = "CATEGORY_ID")
public CategoryEntity getCategoryByParentCategoryId() {
    return categoryByParentCategoryId;
}

public void setCategoryByParentCategoryId(CategoryEntity categoryByParentCategoryId) {
    this.categoryByParentCategoryId = categoryByParentCategoryId;
}

@OneToMany(mappedBy = "categoryByParentCategoryId", cascade = CascadeType.PERSIST)
public Set<CategoryEntity> getCategoriesByCategoryId() {
    return categoriesByCategoryId;
}

public void setCategoriesByCategoryId(Set<CategoryEntity> categoriesByCategoryId) {
    this.categoriesByCategoryId = categoriesByCategoryId;
}

Из этой ссылки и других ответов о переполнении стека, я обнаружил, что могу использовать сортировку и разбиение по страницам, используя Paging Request как

Pageable size = new PageRequest(page, paginationDTO.getSize(),Sort.Direction.ASC, "id");

Моя проблема в том, что у меня есть self join родительские и дочерние отношения, как показано выше в модели, и мне нужно отсортировать родителя по количеству детей, как показано ниже.

Data table for Category Entity

Здесь Number of SubCategories - это размер categoriesByCategoryId. Что мне нужно передать в PageRequest вместо id, чтобы отсортировать по размеру списка ребенка.

PS. В модели есть больше полей, но чтобы вопрос был коротким, я разместил только соответствующие поля

1 Ответ

0 голосов
/ 12 ноября 2018

После прохождения этого ответа Мне удалось выполнить требование с помощью пользовательского запроса, метод в JPARepository выглядел как

@Query(
        value = "select c from CategoryEntity c " +
                " WHERE LOWER(c.categoryNameEn) LIKE LOWER(CONCAT('%',?2, '%')) AND activeInd = ?1 " +
                "AND c.categoryByParentCategoryId is null" +
                " Order By c.categoriesByCategoryId.size desc",
        countQuery = "select count(c) from CategoryEntity c " +
                " WHERE LOWER(c.categoryNameEn) LIKE LOWER(CONCAT('%',?2, '%')) AND activeInd = ?1" +
                " AND c.categoryByParentCategoryId is null"
)
Page<CategoryEntity> findAllActiveCategoriesByCategoriesByCategoryIdCountDesc(String activeInd, String categoryNameEn, Pageable pageable);

Запрос деталей необходим для разбивки на страницы.

...