【问题标题】:MongoTemplate Sorting isn't working for LocalDateTimeMongoTemplate 排序不适用于 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();

会发生什么

  1. 排序不是排序:在第二页中,它从第一页返回许多记录。 LocalDateTime 有问题吗?我查了一下,确实不应该。我试着做

    query.with(Sort.by(Sort.Direction.DESC,"createdAt"));

但结果相同。

  1. 分页不完整,它总是说返回的页面是第一个也是最后一个,hasNext() 和 hasPrevious() 总是返回 false,但在数据库中我有数千个符合条件的条目。
  2. MongoTemplate 是否有机会将 Slice 作为返回类型?无需从 List -> Page -> Slice 投射

调试时,查询对象已经正确设置了skip、first和sort属性,但是结果(至少是排序)是错误的。仍然当我告诉跳过 40 并取前 80 时,这些逻辑似乎是正确的。

我真的不知道我错过了什么,或者它是否是 MongoTemplate 的一种限制(这对我来说是新的)。提前感谢您提供任何提示或想法!

【问题讨论】:

    标签: spring mongodb sorting spring-data-mongodb 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 的贡献者

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多