使用Java 8 Streams的Spring Data JPA存储库

Chr*_*Geo 9 java spring java-8 spring-data spring-data-jpa

假设我有以下存储库:

public interface UserRepository extends JpaRepository<User, Long> {

    @Query("select u from User u")
    Stream<User> streamAllPaged(Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

我想进行搜索:

public Page<User> findAllUsers(Pageable page) {

    Page<User> page = null;
    try (Stream<User> users = userRepository.streamAllPaged(page)) {
            Set<User> users = users.filter(u -> user.getName().equals("foo"))
                    .collect(Collectors.toSet());
            //create page from set?
    }

}
Run Code Online (Sandbox Code Playgroud)

显然我可以使用子列表并手动插入页面大小等但我想应该有更"标准"的方法来做到这一点?

Oli*_*ohm 11

我认为你的用例在这里没有多大意义.如果你想最终得到一个Page结果,从a开始Stream只是效率低下.您可以通过以下方式轻松实现预期的最终结果:

public interface UserRepository extends CrudRepository<User, Long> {

  Page<User> findByName(String name, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

这样可以确保只读取您最初请求的名称数量.在Stream这里使用完全颠覆了这一点,因为过滤Stream将需要将所有 User实例加载到内存中以调用谓词.您肯定希望让数据库执行此操作,只返回首先匹配的值.