MongoTemplate 排序不适用于 LocalDateTime
Posted
技术标签:
【中文标题】MongoTemplate 排序不适用于 LocalDateTime【英文标题】:MongoTemplate Sorting isn't working for LocalDateTime 【发布时间】: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 的一种限制(这对我来说是新的)。提前感谢您提供任何提示或想法!
【问题讨论】:
【参考方案1】:我建议调查spring-boot-starter-data-search。
将启动器添加到您的 pom 文件中:<dependency>
<groupId>app.commerce-io</groupId>
<artifactId>spring-boot-starter-data-search-mongodb</artifactId>
<version>1.1.0</version>
</dependency>
启用搜索存储库:
@Configuration
@EnableMongoRepositories(repositoryBaseClass = SearchRepositoryImpl.class)
public class MyConfiguration
让您的存储库扩展“SearchRepository”
@Repository
public interface UserRepository extends SearchRepository<UserDocument, String>
使用此存储库获取您的数据
String search = "name: myName and email: myEmail";
Page<UserDocument> result = userRepository.findAll(search, pageable);
您可以找到 MongoDB here的演示
免责声明:我是 spring-boot-starter-data-search 的贡献者
【讨论】:
以上是关于MongoTemplate 排序不适用于 LocalDateTime的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序