2016-11-03 23 views
8

phép nói rằng tôi có kho sau:Xuân JPA Repositories dữ liệu với Java 8 Streams

public interface UserRepository extends JpaRepository<User, Long> { 

    @Query("select u from User u") 
    Stream<User> streamAllPaged(Pageable pageable); 
} 

Và tôi muốn thực hiện tìm kiếm:

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

} 

Rõ ràng tôi có thể sử dụng một sublist và tự chèn trang kích cỡ vv nhưng tôi đoán rằng cần có một cách "tiêu chuẩn" hơn để làm điều này?

+1

Tôi đã nghĩ rằng 'Collectors.partitioningBy' có thể giúp ích, nhưng không truy cập vào vị trí trong luồng không thấy cách thực hiện. – Aaron

+1

Nếu bạn không ngại sử dụng luồng khác, [câu hỏi này] (http://stackoverflow.com/questions/29273705/how-to-paginate-a-list-of-objects-in-java-8) có câu trả lời. – Aaron

Trả lời

11

Tôi cho rằng trường hợp sử dụng của bạn không có ý nghĩa quá nhiều ở đây. Nếu bạn muốn kết thúc với một kết quả cuối cùng, bắt đầu với Stream chỉ là không hiệu quả. Bạn có thể dễ dàng đạt được kết quả mong đợi cuối cùng của mình với điều này:

public interface UserRepository extends CrudRepository<User, Long> { 

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

Điều đó đảm bảo bạn chỉ đọc số lượng tên bạn yêu cầu ban đầu. Sử dụng Stream tại đây hoàn toàn làm hỏng điểm khi lọc trên Stream sẽ yêu cầu tất cảUser trường hợp được tải vào bộ nhớ chỉ để gọi vị từ. Bạn chắc chắn muốn cho cơ sở dữ liệu làm điều đó chỉ trả về các giá trị khớp với địa điểm đầu tiên.

Các vấn đề liên quan