Изначально в моем случае у меня есть params = params.append('sort', matSort.active + ',' + matSort.direction) где matSort.active = exID,field1,field2,field3 и matSort.direction = asc. Как мне заставить серверную часть сортировать по переменной, которой нет в возвращаемом объекте DTO, и когда метод репозитория использует собственный запрос?
Я пробовал использовать JpaSort.unsafe, но получил синтаксическую ошибку, поскольку каким-то образом запрос использует справочную таблицу
Результат SQL из консоли
Код: Выделить всё
TableEx1 te
ORDER BY
te.CASE WHEN exID.id = 2 THEN 0 ELSE 1
END,
field1 asc,
field2 asc,
field3 asc
угловая сервисная функция
Код: Выделить всё
listSomething(page: MatPaginator, matSort: MatSort) {
let params: HttParams = FormsUtil.generateParamsForPaginationWithSorting(page, matSort);
return this.http.get
>(${this.endpoint}/list-something, {params});
}
Код: Выделить всё
static generateParamsForPaginationWithSorting(page: MatPaginator, matSort: MatSort): HttpParams {
let params: HttpParams = this.generateParamsForPage(page);
if (matSort != null && matSort.active != null) {
const attribute = ['exID.id', 'exID.IDType', 'EXID.IDType'].find(field => matSort.active.includes(field));
if (attribute) {
params = params.append('orderByExID', attribute);
}
params = params.append('sort', matSort.active + ',' + matSort.direction);
}
return params;
}
Код: Выделить всё
// CONTROLLER:
@GetMapping(“/list-something”) public Page listOrder(Pageable page, String orderByExID) {
return service.searchListOfSomething(page, orderByExID);
}
// SERVICE:
public Page searchListOfSomething(Pageable page, String orderByExID) {
page = createSortForExIDOrder(orderByExID, page);
return repository.searchListOfSomething(page);
}
private Pageable createSortForExIDOrder(String orderByExID, Pageable page) {
if (orderByExID != null) {
Sort sort = JpaSort.unsafe(Sort.Direction.ASC, "CASE WHEN " + orderByExID + " = 1 THEN 0 ELSE 1 END");
sort = sort.and(page.getSort());
return PageRequest.of(page.getPageNumber(), page.getPageSize(), sort);
}
return page;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ava-spring
Мобильная версия