Java 将列表转换为页面,按字段排序和升序/降序

问题描述 投票:0回答:1

我正在使用 Spring Data MongoDb,我想实现一个动态查询过滤器/条件,但具有分页和排序功能。

最初我使用下面的代码(jpa)获取员工列表:

Page<Employee> findAllByBranchIdAndDepartmentAndDisabled(String branchId, String department, boolean active, Pageable page);

但是有一个更改可以返回员工列表(活跃和非),或者仅返回活跃员工。

我也尝试使用@Query,但无法使查询过滤器

active
可选。 我的意思是当 activeOnly 为 true 时,添加查询过滤器
active=true
。 当 activeOnly 为 false 时,不添加查询过滤器
active=true

@Query(value="{ 'branchId': ?0, 'department':?1, 'active':?2 }")
Page<Employee> findEmployees(String branchId, String department, boolean activeOnly, Pageable page);

我可以使用 Criteria 和 MongoTemplate 创建动态查询,但它只支持列表。

我还看到使用PageImpl从List到Page的转换,但PageImpl不做排序。

查询可以按任何员工字段排序,如

firstName, lastName, username, email

有没有更简单/更快/更有效的方法将列表转换为带有排序的页面?

看来我只能使用PageImpl,但在将处理后的列表传递给PageImpl之前我必须手动进行子列表和排序。

还有什么更好的办法吗?

java spring-data-jpa spring-data-mongodb
1个回答
0
投票

我不知道我是否理解正确,但也许你可以添加类似

OR FALSE == activeOnly
的内容,这样查询将是:

  • 当值为
    true
    时:
    FALSE == TRUE OR active == TRUE
    ,因此它将按
    active
    true
    的值进行过滤。
  • 当值为
    false
    时:
    FALSE == FALSE OR active == FALSE
    ,因此它将输出任何活动的 true 或 false,因为
    false
    将始终等于
    false

所以查询可以是这样的(未经测试):

@Query(value="{ 'branchId': ?0, 'department': ?1, '$or': [ { '$expr': { '$eq': [ false, ?2 ] } }, { 'active': ?2 } ] }")
Page<Employee> findEmployees(String branchId, String department, boolean activeOnly, Pageable page);

您可以访问这个示例来检查是否符合您的期望。

© www.soinside.com 2019 - 2024. All rights reserved.