Я использую NamedNativeQueries с SqlResultSetMappings в приложении Spring Data (JPA Hibernate MySQL), и я успешно справился с разбиением на страницы, но не с сортировкой.
Я пробовал две формызапросы:
@NamedNativeQuery(
name = "DatasetDetails.unallocatedDetailsInDataset",
resultClass = DatasetDetails.class,
resultSetMapping = "DatasetDetails.detailsForAllocation",
query = "SELECT dd.id, fk_datasets_id, fk_domains_id, fk_sources_id, dom.name AS domain, " +
"src.name AS source " +
"FROM datasets AS d " +
"JOIN datasets_details AS dd ON dd.fk_datasets_id = d.id " +
"JOIN sources AS src ON src.id = dd.fk_sources_id " +
"JOIN domains AS dom ON dom.id = dd.fk_domains_id " +
"WHERE fk_datasets_id = :datasetId " +
"AND dd.id NOT IN (" +
"SELECT fk_datasets_details_id from allocations_datasets_details) \n/* #page */\n"),
, а второй просто использует запись счета во втором запросе вместо использования #page.
@NamedNativeQuery(
name = "DatasetDetails.unallocatedDetailsInDataset.count",
resultClass = DatasetDetails.class,
resultSetMapping = "DatasetDetails.detailsForAllocation",
query = "SELECT count(*)
....
Оба метода работают для разбивки на страницы, но сортировка игнорируется.
Вот хранилище:
public interface DatasetDetailsRepository extends PagingAndSortingRepository<DatasetDetails, Long> {
@Query(nativeQuery = true)
List<DatasetDetails> unallocatedDetailsInDataset(@Param("datasetId") long datasetId,
@Param("page") Pageable page);
}
И страница может быть собрана следующим образом:
Sort sort = Sort.by(Sort.Order.asc(DatasetDetails.DOMAIN), Sort.Order.asc(DatasetDetails.SOURCE));
Pageable page = PageRequest.of(page, limit, sort);
Не выдается никаких ошибок, но сортировка просто не выполняется, и ORDER BY не генерируется.
Явное добавление чего-то вроде ORDER BY # {# page} не компилируется.