我正在使用 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之前我必须手动进行子列表和排序。
还有什么更好的办法吗?
我不知道我是否理解正确,但也许你可以添加类似
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);
您可以访问这个示例来检查是否符合您的期望。