2015-09-11 24 views
7

Có thể tìm nạp dữ liệu trong phạm vi do người dùng xác định [int record record -int last record] không?Cách truy vấn dữ liệu qua JPA dữ liệu Spring với bù đắp và giới hạn do người dùng xác định (Phạm vi)

Trong trường hợp của tôi người dùng sẽ xác định trong chuỗi truy vấn trong đó phạm vi anh ta muốn tìm nạp dữ liệu. Tôi đã thử một cái gì đó như thế này

Pageable pageable = new PageRequest(0, 10); 
    Page<Project> list = projectRepository.findAll(spec, pageable); 

đâu spec là đặc điểm kỹ thuật định nghĩa của tôi, nhưng tiếc là điều này không giúp đỡ. Có thể tôi đang làm điều gì sai ở đây.

Tôi đã thấy các phương pháp jpa khác được cung cấp vào mùa xuân nhưng không có gì giúp ích nhiều.

người dùng có thể nhập nội dung nào đó như localhost này: 8080/Phần/nhân viên? phạm vi {"columnName": name, "from": 6, "to": 20}

Vì vậy, điều này nói để tìm nạp dữ liệu của nhân viên và nó sẽ tìm nạp 15 bản ghi đầu tiên (được sắp xếp theo tên cột) không quan trọng bằng hiện nay.

Nếu bạn có thể đề xuất cho tôi điều gì đó tốt hơn sẽ tuyệt vời. Nếu bạn cho rằng tôi chưa cung cấp đủ thông tin, vui lòng cho tôi biết, tôi sẽ cung cấp thông tin bắt buộc.

Cập nhật: Tôi không muốn sử dụng báo cáo truy vấn gốc hoặc Tạo truy vấn (cho đến khi tôi không có bất kỳ tùy chọn nào khác). Có thể giống như sau:

Pageable pageable = new PageRequest(0, 10); 
     Page<Project> list = projectRepository.findAll(spec, new pageable(int startIndex,int endIndex){ 
// here my logic. 

}); 

Nếu bạn có lựa chọn tốt hơn, bạn cũng có thể đề xuất cho tôi.

Cảm ơn.

Trả lời

6

cách tiếp cận của bạn không làm việc, bởi vì new PageRequest(0, 10); doens't làm những gì bạn suy nghĩ. Như đã nêu trong docs, các đối số đầu vào là pagesize, không giới hạn và bù trừ.

Theo như tôi biết (và ai đó sửa tôi nếu tôi sai), không có hỗ trợ "ra khỏi hộp" cho những gì bạn cần trong kho SrpingData mặc định. Nhưng bạn có thể tạo cài đặt tùy chỉnh Pagable, sẽ có các thông số giới hạn/bù đắp. Đây là cơ bản ví dụ - Spring data Pageable and LIMIT/OFFSET

+0

cảm ơn câu trả lời của bạn, nó chắc chắn đã cho tôi hướng đi. – Roxy

4

Chúng ta có thể làm điều này với Pagination và bằng cách đặt tên cột bảng cơ sở dữ liệu, giá trị & hàng đếm như sau:

@Transactional(readOnly=true) 
public List<String> queryEmployeeDetails(String columnName,String columnData, int startRecord, int endRecord) { 
    Query query = sessionFactory.getCurrentSession().createQuery(" from Employee emp where emp.col= :"+columnName); 
    query.setParameter(columnName, columnData); 
    query.setFirstResult(startRecord); 
    query.setMaxResults(endRecord); 
    List<String> list = (List<String>)query.list(); 
    return list; 
} 
+0

nhờ cho câu trả lời của bạn ... bạn có thể minh họa cho tôi, làm thế nào chúng ta có thể đạt được điều này với Pagination? – Roxy

+0

Tôi tin rằng bạn đang cố gắng viết 'từ emp Employee nơi emp.' + columnName + '=: foo'' và sau đó là 'query.setParameter (" foo ", columnData);'? –

1

Nếu tôi hiểu vấn đề của bạn một cách chính xác, bạn muốn kho của bạn để cho phép người dùng

  1. Cung cấp tiêu chuẩn cho truy vấn (thông qua Specification)
  2. Cung cấp cột để sắp xếp
  3. Cung cấp phạm vi kết quả để truy xuất.

Nếu hiểu biết của tôi là chính xác, sau đó:

Để đạt được 1., bạn có thể tận dụng JpaSpecificationExecutor từ mùa xuân dữ liệu JPA, cho phép bạn để vượt qua trong Specificiation cho truy vấn.

Cả 2 và 3 đều có thể đạt được trong JpaSpecificationExecutor bằng cách sử dụng Pagable. Pageable cho phép bạn cung cấp chỉ mục bắt đầu, số lượng bản ghi và cột sắp xếp cho truy vấn của bạn. Bạn cần triển khai phạm vi Pageable dựa trên phạm vi của mình. PageRequest là một tài liệu tham khảo tốt về những gì bạn có thể thực hiện (hoặc bạn có thể mở rộng nó tôi tin).

+0

cảm ơn cho câu trả lời của bạn, bạn có thể xin vui lòng chuyển hướng tôi đến một số ví dụ, trong đó cho thấy việc sử dụng JpaSpecificationExecutor? tiếc là tôi đã không tìm thấy bất kỳ. – Roxy

+1

Đã không sử dụng thực sự. Đây là những gì tôi tìm thấy bởi google: http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ Mặc dù họ đang sử dụng QueryDSL để xây dựng đặc tả, tôi tin rằng bạn có thể làm điều đó bằng một số cách thủ công hơn (QueryDSL yêu cầu tạo mã có thể là mối quan tâm của bạn). Ít nhất trang cung cấp cho bạn ý tưởng về cách làm việc với 'JpaSpecificationExecutor' –

+1

Thực ra tôi đã bỏ lỡ rằng 'Pageable' cũng đang cung cấp' Sort'. Do đó, một tùy chỉnh 'Pageable' (hoặc sử dụng' PageRequest') sẽ làm các trick –

1

Vì vậy, tôi đã làm việc này là một trong những câu trả lời gợi ý, tôi thực hiện pageable của riêng tôi và overrided getPagesize(), getOffset(), getSort() thats it. (Trong trường hợp của tôi, tôi đã làm không cần thêm)

public Range(int startIndex, int endIndex, String sortBy) { 
     this.startIndex = startIndex; 
     this.endIndex = endIndex; 
     this.sortBy = sortBy; 
    } 

    @Override 
    public int getPageSize() { 
     if (endIndex == 0) 
      return 0; 
     return endIndex - startIndex; 
    } 

    @Override 
    public int getOffset() { 
     // TODO Auto-generated method stub 
     return startIndex; 
    } 

    @Override 
    public Sort getSort() { 
     // TODO Auto-generated method stub 
     if (sortBy != null && !sortBy.equalsIgnoreCase("")) 
      return new Sort(Direction.ASC, sortBy); 
     else 
      return new Sort(Direction.ASC, "id"); 
    } 

nơi startIndex, endIndex đang bắt đầu và chỉ số cuối cùng của kỷ lục.

để truy cập nó:

repository.findAll(spec,new Range(0,20,"id");

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