2009-07-12 29 views

Trả lời

57

Bạn nói đúng. Đặc điểm kỹ thuật JPA không nói gì về nó. Nhưng Java Persistence với Hibernate cuốn sách, 2nd edition, nói:

Nếu kết quả truy vấn là trống rỗng, một null được trả về

Hibernate JPA thực hiện (Entity Manager) trở lại null khi bạn gọi truy vấn .getResultList() không có kết quả.

CẬP NHẬT

Như đã chỉ ra bởi một số người dùng, có vẻ như rằng một phiên bản mới nhất của Hibernate trả về một danh sách trống để thay thế.

+19

Điều này chắc chắn đã lỗi thời, Hibernate trả về một danh sách trống. –

+4

Kể từ phiên bản nào? – Tom

+1

Tôi vẫn nhận được null từ Hibernate 4.3.10 (chạy như động cơ JPA cho Spring Data). Điều này chỉ xảy ra cho một truy vấn gốc duy nhất, vì các truy vấn JPA điển hình hoạt động như mong đợi. –

20

Nếu thông số kỹ thuật cho biết điều đó không thể xảy ra, bạn có tin họ không? Giả sử rằng mã của bạn có thể có khả năng chạy ngược lại với các triển khai JPA khác nhau, bạn có tin tưởng mọi người triển khai thực hiện đúng không?

Không có vấn đề gì, tôi sẽ bảo vệ mã và kiểm tra giá trị rỗng.

Bây giờ câu hỏi lớn: chúng ta có nên coi "null" và một Danh sách trống là đồng nghĩa không? Đây là nơi các thông số kỹ thuật sẽ giúp chúng tôi, và không.

Đoán của tôi là trả về null (nếu thực sự nó có thể xảy ra) sẽ tương đương với "Tôi không hiểu truy vấn" và danh sách trống sẽ là "có, hiểu truy vấn, nhưng không có bản ghi".

Bạn có thể có một đường dẫn mã (có thể là một ngoại lệ) đề cập đến các truy vấn không thể bỏ qua, tôi có xu hướng chỉ đạo một số không trả về đường dẫn đó.

+0

+1 bạn đúng khi nói: "bạn có tin tưởng mọi nhà cung cấp JPA không?" NO :) – dfa

+0

Đã chỉnh sửa thêm: Arthur đã chỉ ra rằng HPA của Hibernate thực tế trả về null nếu không tìm thấy bản ghi nào. Vì vậy, trong thực tế trong trường hợp này, chúng ta cần phải gấp lại với nhau rỗng và trống danh sách. Tôi tin rằng quá trình suy nghĩ mà chúng tôi đã trải qua ở trên vẫn hợp lệ. Thậm chí có thể hiểu rằng chúng ta nên có các cách xử lý khác nhau về giá trị rỗng cho các ngăn xếp JPA khác nhau. Chào mừng bạn đến với tính di động thú vị. – djna

+0

Đồng ý. Chỉ tồn tại "tính di động vui nhộn" do đặc tả JPA không làm những gì cần làm ... chỉ định ngữ nghĩa chính xác.Xấu hổ nó được điều hành bởi ủy ban với các quyền lợi được ban cho. – DataNucleus

13

Trái ngược với bài đăng của Arthur, khi tôi thực sự chạy một truy vấn không có đối tượng nào khớp với nhau, tôi có một danh sách trống, không phải là rỗng. Đây là sử dụng Hibernate và là những gì tôi xem xét hành vi chính xác: một danh sách trống là câu trả lời đúng khi bạn yêu cầu một bộ sưu tập các thực thể và không có bất kỳ.

+2

cho OpenJPA, tôi cũng nhận được một danh sách trống thay vì null. – Gnavvy

1

Tất nhiên, nếu bạn kiểm tra tập hợp kết quả với CollectionUtils.isNotEmpty của Jakarta, bạn sẽ được bảo vệ theo một trong hai cách.

1

Nếu bạn nhìn kỹ vào org.hibernate.loader.Loader (4.1), bạn sẽ thấy danh sách luôn được khởi tạo bên trong phương thức processResultSet() (doc, source).

protected List processResultSet(...) throws SQLException { 
    final List results = new ArrayList(); 

    handleEmptyCollections(queryParameters.getCollectionKeys(), rs, session); 
    ... 
    return results; 

} 

Vì vậy, tôi không nghĩ rằng nó sẽ trả về null ngay bây giờ.

+2

Chúc mừng cho đoạn mã chính xác. Nhưng câu trả lời này tập trung vào hibernate chỉ là một trong những thực hiện các đặc điểm kỹ thuật. Thực hiện khác như OpenJPA khác nhau trong hành vi. Ngoài ra, hibernate dường như đã thay đổi hành vi trên các phiên bản khác nhau. – venky