2016-04-18 32 views
7

Tôi đang cố gắng để có được một trang của một tổ chức từng phần (NetworkSimple) bằng cách sử dụng tính năng mới của dữ liệu mùa xuân, projectionsLàm thế nào để sử dụng các giao diện chiếu với phân trang trong JPA dữ liệu mùa xuân?

Tôi đã kiểm tra tài liệu và nếu tôi chỉ yêu cầu:

Collection<NetworkSimple> findAllProjectedBy(); 

Nó công trình, nhưng nếu tôi đang sử dụng pageable:

Page<NetworkSimple> findAllProjectedBy(Pageable pageable); 

Nó ném một lỗi:

org.hibernate.jpa.criteria.expression.function.AggregationFunction$COUNT cannot be cast to org.hibernate.jpa.criteria.expression.CompoundSelectionImpl 

Bất kỳ ai đã làm việc với điều này?

My NetworkSimple lớp như sau:

public interface NetworkSimple { 
    Long getId(); 

    String getNetworkName(); 

    Boolean getIsActive(); 
} 

Trả lời

8

Lưu ý: Tính năng này sẽ hoạt động theo cách mô tả bởi các poster ban đầu nhưng do this bug nó thì không. Lỗi này đã được sửa cho bản phát hành Hopper SR2, nếu bạn bị kẹt trên một phiên bản cũ thì cách giải quyết bên dưới sẽ hoạt động.

Có thể sử dụng Pageable với các tính năng chiếu truy vấn mới được giới thiệu trong JPA dữ liệu Spring 1.10 (Hopper). Bạn sẽ cần phải sử dụng chú thích @Query và viết một truy vấn theo cách thủ công cho các trường bạn yêu cầu, chúng cũng phải được đặt bí danh bằng cách sử dụng AS để cho phép Dữ liệu mùa xuân tìm ra cách chiếu kết quả. Có một ví dụ tốt trong spring-boot-samples một phần của kho lưu trữ khởi động mùa xuân.

Trong ví dụ của bạn nó sẽ là khá đơn giản:

@Query("SELECT n.id AS id, n.name AS networkName, n.active AS isActive FROM Network n") 
Page<NetworkSimple> findAllProjectedBy(Pageable pageable); 

tôi đã thực hiện các giả định rằng tổ chức của bạn trông giống như sau:

@Entity 
public class Network 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String name; 

    @Column 
    private boolean active; 

    ... 
} 

Xuân Dữ liệu sẽ lấy được một truy vấn số tự động cho thông tin phân trang. Cũng có thể sử dụng các phép nối trong truy vấn để tìm nạp các liên kết và sau đó tóm tắt chúng trong phép chiếu.

+0

Cảm ơn, tôi sẽ kiểm tra và kiểm tra nó. –

+1

Điều đó không hoàn toàn chính xác. Điều này thực sự nên làm việc như poster ban đầu mong đợi nhưng bạn trình bày một workaround hợp lệ. Tôi đã thay đổi [ticket] (https://jira.spring.io/browse/DATAJPA-909) đã được nộp bởi poster gốc để cập nhật các tài liệu với cách giải quyết của bạn để sửa lỗi thực tế. Sẽ được mát mẻ, nếu bạn có thể cập nhật câu trả lời của bạn để đề cập đến nó. Bản sửa lỗi sẽ có trong Hopper SR2. –

+0

Vé được cố định, ảnh chụp nhanh có sẵn, được bao gồm trong SR2 của Hopper. –

0

Vấn đề này có thể đến từ các tên phương pháp. Từ khóa có nghĩa là bạn ae lọc dữ liệu theo một thuộc tính cụ thể: findByName chẳng hạn. gọi là tạo truy vấn từ tên phương pháp:

http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation

Vì vậy, thử với Page<NetworkSimple> findAll(Pageable pageable);

+0

Nếu tôi xóa "By", nó trả về thông báo lỗi vì không thể tạo truy vấn. 'org.springframework.data.mapping.PropertyReferenceException: Không tìm thấy thuộc tính findAllProjected cho loại Network!' –

+0

Bạn không nên sử dụng phương thức findAll –

+0

Nhưng tôi không thể sử dụng điều đó vì trả về là đối tượng Mạng và tôi muốn chiếu. –

0

Bạn có thể sử dụng:

@Query("SELECT n FROM Network n") 
Page<? extends NetworkSimple> findAllProjectedBy(Pageable pageable); 
0

Ngay cả với mùa xuân-data-JPA 1.11.4, một cái gì đó giống như

public interface NetworkRepository extends JpaRepository<Network, String> { 
    Page<NetworkSimple> findAll(Pageable pageable); 
} 

sẽ không biên dịch; báo cáo

findAll(org.springframework.data.domain.Pageable) in NetworkRepository clashes with findAll(org.springframework.data.domain.Pageable) in org.springframework.data.repository.PagingAndSortingRepository 
return type org.springframework.data.domain.Page<NetworkSimple> is not compatible with org.springframework.data.domain.Page<Network> 

Cách giải quyết chúng tôi tìm thấy là để đổi tên FindAll để FindAll By, ví dụ

public interface NetworkRepository extends JpaRepository<Network, String> { 
    Page<NetworkSimple> findAllBy(Pageable pageable); 
} 
Các vấn đề liên quan