【发布时间】:2019-08-14 21:20:57
【问题描述】:
我在 Spring Data (JPA Hibernate MySQL) 应用程序中使用 NamedNativeQueries 和 SqlResultSetMappings,并且我在分页方面取得了成功,但在排序方面没有成功。
我尝试了两种形式的查询:
@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);
}
pageable 是这样组装的:
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} 之类的内容不会编译。
【问题讨论】:
-
您是如何在 NamedNativeQuery 上获得分页的?您在查询中使用了页面对象还是在 NamedNativeQuery 中以任何方式传递了它?我注意到即使您传入了 pageable 参数,但返回类型是 List 而不是 Page。
标签: java spring-data-jpa