【发布时间】:2021-12-28 14:56:58
【问题描述】:
我有一个带有 Java 16 + GraphQL + Mongo 的 SpringBoot 应用程序。 我正在尝试通过某些属性查找所有记录,这些记录可能恰好为 NULL。 此外,我正在尝试实现分页和排序,只要我使用 Mongo/JPA 就可以像魅力一样工作。 然后我不得不退后一步,转移到 MongoTemplate,以便根据传递的填充属性创建自定义标准。现在什么都没有正常工作。
我的文档
@Data
@Document(collection = "user")
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@NoArgsConstructor
@Builder
public class UserDocument {
@Id
private String id;
private String name;
private String email;
private LocaleDateTime createdAt;
}
我的仓库
@Repository
public interface UserRepository {
Page<UserDocument> findUsersByProperties(String name, String email, Pageable page);
}
我实现我的 Repo 的类
@Repository
public class UserCustom implements UserRepository {
@Autowired
MongoTemplate mongoTemplate;
public Page<UserDocument> findUsersByProperties(String name, String email, Pageable page) {
final Query query = new Query().with(page);
final List<Criteria> criteria = new ArrayList<>();
if (name != null && !name.isEmpty()) {
criteria.add(Criteria.where("name").is(name));
}
if (email != null && !email.isEmpty()) {
criteria.add(Criteria.where("email").is(email));
}
List<UserDocument> users = mongoTemplate.find(query, UserDocument.class);
return PageableExecutionUtils.getPage(users, page,
() -> (long)users.size());
}
}
我调用这个方法并设置Pageable的代码
Pageable pageable = PageRequest.of(skip == 0 ? skip : skip/first, first).withSort(Sort.by(Sort.Direction.DESC,"createdAt"));
Page<UserDocument> result = userRepository.findUsersByProperties(name, email, pageable);
List<UserDocument> contentsResult = result.getContent();
会发生什么
-
排序不是排序:在第二页中,它从第一页返回许多记录。 LocalDateTime 有问题吗?我查了一下,确实不应该。我试着做
query.with(Sort.by(Sort.Direction.DESC,"createdAt"));
但结果相同。
- 分页不完整,它总是说返回的页面是第一个也是最后一个,hasNext() 和 hasPrevious() 总是返回 false,但在数据库中我有数千个符合条件的条目。
- MongoTemplate 是否有机会将 Slice 作为返回类型?无需从 List -> Page -> Slice 投射
调试时,查询对象已经正确设置了skip、first和sort属性,但是结果(至少是排序)是错误的。仍然当我告诉跳过 40 并取前 80 时,这些逻辑似乎是正确的。
我真的不知道我错过了什么,或者它是否是 MongoTemplate 的一种限制(这对我来说是新的)。提前感谢您提供任何提示或想法!
【问题讨论】:
标签: spring mongodb sorting spring-data-mongodb mongotemplate