gpt4 book ai didi

java - 带有 Java 8 Streams 的 Spring Data JPA 存储库

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:15:59 24 4
gpt4 key购买 nike

假设我有以下存储库:

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

}

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

最佳答案

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

public interface UserRepository extends CrudRepository<User, Long> {

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

这将确保您只读取您最初请求的名称数量。在此处使用 Stream 完全颠覆了这一点,因为对 Stream 的过滤将需要加载 all User 实例进入内存只是为了调用谓词。您绝对希望让数据库只返回首先匹配的值。

关于java - 带有 Java 8 Streams 的 Spring Data JPA 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398028/

24 4 0