假设我有以下存储库:
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?
}
}
显然我可以使用子列表并手动插入页面大小等,但我想应该有更“标准”的方法来做到这一点?
答案 0 :(得分:11)
我认为你的用例在这里没有多大意义。如果您希望最终获得Page
结果,那么从Stream
开始效率很低。您可以通过以下方式轻松实现预期的最终结果:
public interface UserRepository extends CrudRepository<User, Long> {
Page<User> findByName(String name, Pageable pageable);
}
确保您只读取最初请求的姓名数量。在这里使用Stream
完全颠覆了这一点,因为Stream
上的过滤将要求所有 User
实例加载到内存中以调用谓词。您肯定希望让数据库执行此操作,只返回首先匹配的值。