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

时间:2016-11-03 09:33:56

标签: 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);
}

我想进行搜索:

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?
    }

}

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

1 个答案:

答案 0 :(得分:11)

我认为你的用例在这里没有多大意义。如果您希望最终获得Page结果,那么从Stream开始效率很低。您可以通过以下方式轻松实现预期的最终结果:

public interface UserRepository extends CrudRepository<User, Long> {

  Page<User> findByName(String name, Pageable pageable);
}

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