2013-03-18 51 views
8

Có cách nào để xác định Đặc tả dữ liệu mùa xuân (trả về biến vị ngữ JPA) có mục đích duy nhất là thực hiện tìm nạp háo hức không?Tìm nạp JPA dữ liệu mùa xuân

Tôi có một thực thể xác định các mối quan hệ khác nhau bằng cách tải chậm, nhưng có một số truy vấn mà tôi muốn trả về toàn bộ biểu diễn thực thể bao gồm tất cả các bộ sưu tập liên quan, nhưng tiêu chí của các truy vấn này có thể khác nhau. Tôi đã nhìn thấy một vài bài đăng (ví dụ: trên spring forum) thảo luận về việc giới thiệu tiềm năng các nhóm tìm nạp, đây có thể là giải pháp lý tưởng; tuy nhiên, vì đây chưa phải là một phần của đặc tả JPA, Spring Data không cung cấp hỗ trợ cho nó.

Tôi đang tìm cách tái sử dụng để thực hiện tìm nạp mong muốn trên nhiều truy vấn động khác nhau.

Ví dụ, tôi đã coi việc phát triển một số kỹ thuật tái sử dụng với mục đích duy nhất là để thực hiện việc bốc háo hức, và có thể được kết hợp với thông số kỹ thuật khác, ví dụ:

private static Specification<MyEntity> eager() { 

    return new Specification<MyEntity>() { 

     @Override 
     public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      for (PluralAttribute<? super MyEntity, ?, ?> fetch : root.getModel().getPluralAttributes()) { 
       root.fetch(fetch, JoinType.LEFT); 
      } 
      query.distinct(true); 
      return null; 
     } 

    }; 
} 

Mục đích của kỹ thuật này là để tái sử dụng nó trong các truy vấn khác nhau, ví dụ:

repository.findAll(where(eager()).and(otherCriteria).or(otherCriteria)); 

Tuy nhiên, đặc điểm kỹ thuật lấy háo hức không phải là một vị đúng, vì vậy nó sẽ trả về null, và sẽ gây ra vấn đề rõ ràng (ví dụ NullPointerExceptions) khi CHAINE d với các vị từ khác.

(Lưu ý rằng vị từ này một mình hoạt động như mong đợi; tức là truy vấn sau sẽ tìm nạp đúng cách: repository.findAll(eager());).

Có một Predicate không có giá trị thích hợp có thể được trả về từ đặc tả "háo hức" hay không. Có cách tiếp cận tái sử dụng khác để kích hoạt tìm nạp mong muốn bằng cách sử dụng thông số JPA Spring Data (không cần phải tải)?

+0

Tôi nhận được ngoại lệ sau khi sử dụng phương pháp tiếp cận của bạn: "truy vấn tìm nạp được chỉ định truy vấn, nhưng chủ sở hữu của liên kết được tìm nạp không có trong danh sách chọn". – svlada

+0

cách khác, có cách tiếp cận như thế này sẽ làm việc để làm cho tất cả các mối quan hệ lười biếng? – chrismarx

Trả lời

6

Chúng tôi đã cải thiện việc xử lý nullSpecification s và Predicate s trong quá trình sửa chữa DATAJPA-300. Bạn có thể muốn thử 1.4 ảnh chụp nhanh và xem điều này ảnh hưởng như thế nào đến kịch bản của bạn.

+0

Ảnh chụp nhanh hoạt động hoàn hảo cho trường hợp sử dụng của tôi. Cảm ơn! – shelley

+0

@Oliver Gierke Bạn là người anh em tuyệt vời –

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