2017-08-31 23 views
5

Tất cả những gì tôi biết là FindBy có thể trả về nhiều kết quả trong khi FindOneBy sẽ trả về một kết quả hoặc null khi chúng ta sử dụng nó theo cách sau.Sự khác biệt giữa findBy và findOneBy trong dữ liệu Spring JPA

List<Department> findByDepartmentName(String name); 
Department findOneByDepartmentId(Long Id); 

bây giờ, câu hỏi của tôi là, tôi có thể sử dụng findBy theo cách này không?

Department findByDepartmentId(Long Id); 

Nếu có,

  • Hãy giả định có nhiều bản ghi cho Id nhất định.
  • Trên cơ sở nào findBydepartmentId trả lại một bản ghi?

Cuối cùng, khi nào hoặc Tại sao tôi không nên sử dụng findBy thay cho findOneBy?

+0

Tôi có cùng một câu hỏi, bạn đã nhận được thông tin này chưa? – Doug

Trả lời

0

tôi có thể sử dụng findBy theo cách này không? Cục findByDepartmentId (Long Id);

Vâng, cú pháp này về mặt kỹ thuật là chính xác theo quan điểm của Spring JPA. Mặc dù Spring JPA cũng thông báo những gì bạn đang cố gắng đạt được với truy vấn của bạn cũng đang tìm kiếm kiểu trả về.

Về cơ bản đây là những trường hợp với nhiều loại trở lại:

  • với truy vấn của bạn, bạn muốn trả về một giá trị duy nhất - bạn có thể chỉ định loại hình cơ bản, Entity T, Optional<T>, CompletableFuture<T>, vv

  • với truy vấn của bạn mà bạn muốn trả về bộ sưu tập T - bạn có thể chỉ định List<T>, Stream<T>, Page<T>, Slice<T> v.v.

Điều đó đang được nói, định nghĩa truy vấn của bạn:

Department findByDepartmentId(Long Id); 

có nghĩa là bạn mong đợi một kết quả duy nhất (vì bạn đã chỉ định một thực thể duy nhất như là một kiểu trả về). Điều này sẽ phản ánh về cách Spring JPA thực hiện truy vấn - nó sẽ gọi getSingleResult() trên giao diện javax.persistence.Query, sẽ ném một exception nếu có nhiều đối tượng đáp ứng các tiêu chí.

Trên cơ sở nào findBydepartmentId trả lại một bản ghi?

Trên cơ sở có một đối tượng duy nhất với Id đó, nếu không nó sẽ ném một ngoại lệ.

Khi nào hoặc Tại sao tôi không nên sử dụng findBy thay cho findOneBy?

Hai giá trị này có ý nghĩa khác nhau và không thể hoán đổi cho nhau.

findOneBy luôn dẫn đến getSingleResult() được gọi.

findBy có hành vi khác nhau tùy thuộc vào loại trả về - theo các định nghĩa được nêu ở trên.

0

findOneByXX sẽ đảm bảo rằng chỉ có một hoặc không có giá trị, nếu có 2 giá trị, một ngoại lệ sẽ được ném. Tuy nhiên findByXX không thực hiện kiểm tra tính độc đáo này

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