Lor*_*nzo 1 java spring-data-jpa
我在 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"),
Run Code Online (Sandbox Code Playgroud)
第二个只是在第二个查询中使用计数表示法,而不是使用 #page 表示法。
@NamedNativeQuery(
name = "DatasetDetails.unallocatedDetailsInDataset.count",
resultClass = DatasetDetails.class,
resultSetMapping = "DatasetDetails.detailsForAllocation",
query = "SELECT count(*)
....
Run Code Online (Sandbox Code Playgroud)
这两种方法都适用于分页,但排序被忽略。
这是存储库:
public interface DatasetDetailsRepository extends PagingAndSortingRepository<DatasetDetails, Long> {
@Query(nativeQuery = true)
List<DatasetDetails> unallocatedDetailsInDataset(@Param("datasetId") long datasetId,
@Param("page") Pageable page);
}
Run Code Online (Sandbox Code Playgroud)
可分页像这样组装:
Sort sort = Sort.by(Sort.Order.asc(DatasetDetails.DOMAIN), Sort.Order.asc(DatasetDetails.SOURCE));
Pageable page = PageRequest.of(page, limit, sort);
Run Code Online (Sandbox Code Playgroud)
没有抛出错误,但排序根本没有完成,也没有生成 ORDER BY。
显式添加诸如 ORDER BY #{#page} 之类的内容将无法编译。
小智 6
我遇到了同样的问题,我不得不使用NamedNativeQuery不同的列和方向动态过滤/排序;显然排序被忽略了。我找到了这个解决方法,这不一定很好,但它可以完成工作:
对于存储库:
List<MyEntity> findMyEntities(
@Param("entityId") long entityId,
@Param("sortColumn") String sortColumn,
@Param("sortDirection") String sortDirection,
Pageable page);
Run Code Online (Sandbox Code Playgroud)
本机查询如下所示:
@NamedNativeQueries({
@NamedNativeQuery(name = "MyEntity.findMyEntities",
query = "select e.field1, e.field2, ..." +
" from my_schema.my_entities e" +
" where condition1 and condtition2 ..." +
" order by " +
" CASE WHEN :sortColumn = 'name' and :sortDirection = 'asc' THEN e.name END ASC," +
" CASE WHEN :sortColumn = 'birthdate' and :sortDirection = 'asc' THEN e.birthdate END ASC," +
" CASE WHEN :sortColumn = 'name' and :sortDirection = 'desc' THEN e.name END DESC," +
" CASE WHEN :sortColumn = 'birthdate' and :sortDirection = 'desc' THEN e.birthdate END DESC" +
),
@NamedNativeQuery(name = "MyEntity.findMyEntities.count",
query = "select count(*) from my_schema.my_entities e" +
" where condition1 and condtition2 ..." +
" and :sortColumn = :sortColumn and :sortDirection = :sortDirection"
)
})
Run Code Online (Sandbox Code Playgroud)
请注意,在 count 查询中,我对:sortColumnand使用了 2 个冗余条件:sortDirection,因为一旦@Param在存储库函数中指定,您就需要在实际查询中使用它们。
调用该函数时,在我的服务中,我有一个指示方向的布尔值和一个指示排序列的字符串,如下所示:
public Page<MyEntity> serviceFindFunction(Long entityId, String sortColumn, Boolean sortDirection, Integer pageNumber, Integer pageSize) {
String sortDir = (sortDirection) ? 'asc' : 'desc';
Pageable pageable = new PageRequest(pageNumber, pageSize); // Spring Data 1.0 syntax
// for Spring Data 2.0, as you were using, simply:
// Pageable pageable = PageRequest.of(pageNumber, pageSize);
return entityRepository.findMyEntities(entityId, sortColumn, sortDir, pageable)
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢的两件事是count 查询中sortColumn和sortDirectionparams的冗余使用,以及我编写 order by 语句的方式。使用单独的CASE语句的原因是我排序的列有不同的数据类型,如果它们不兼容(例如nvarchar和date),查询将失败并显示错误:
Conversion failed when converting date and/or time from character string
我也可能嵌套条件,即首先为方向创建一个案例,为列创建一个内部案例,但我的 SQL 技能仅到此为止。
希望这可以帮助!非常欢迎任何反馈或改进。
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |