Javax.persistence.Query.getResultList () có thể trả về null không?


115

Và nếu vậy, trong những trường hợp nào?

Javadoc và JPA spec không nói gì.


Tôi đã tìm kiếm chính xác câu hỏi này! tks! lên 4 bạn!
rafa.ferreira

Câu trả lời:


69

Bạn đúng rồi. Đặc điểm kỹ thuật của JPA không nói gì về nó. Nhưng cuốn sách Java Persistence with Hibernate, ấn bản thứ 2 , nói:

Nếu kết quả truy vấn trống, trả về giá trị null

Triển khai JPA ngủ đông (Trình quản lý thực thể) trả về null khi bạn gọi query.getResultList () mà 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ư phiên bản Hibernate mới nhất trả về một danh sách trống.

Danh sách trống cũng được trả về trong Eclipselink khi không có kết quả nào được tìm thấy.


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

2
Tôi vẫn nhận được null từ Hibernate 4.3.10 (chạy dưới dạng công cụ JPA cho Dữ liệu mùa xuân). Điều này chỉ xảy ra đối với một truy vấn gốc, vì các truy vấn JPA điển hình hoạt động như mong đợi.
Jacek Prucia

1
Chỉ cần kiểm tra cả hai điều kiện bằng OR. if(rows == null || rows.size == 0){}nơi hàng là gì () trả về getResultList
Number945

Chỉ cần bọc nó trong Optional.ofNullable () và bạn đã thiết lập xong.
de.la.ru 22/09/17

Tôi tin rằng việc quay trở lại nullthay vì một danh sách trống không phải là những gì được dự kiến ​​bởi thông số kỹ thuật vì nó làm cho nó khá rõ ràng khi có thể mong đợi nullở những nơi khác. Đặc biệt là tài liệu để getResultListđọc Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. Tất nhiên tôi vẫn sẽ kiểm tra nullvà tự trả lại danh sách trống nếu cần.
René

23

Nếu thông số kỹ thuật nói rằng điều đó không thể xảy ra, bạn có tin chúng không? Giả sử rằng mã của bạn có thể chạy dựa trên các triển khai JPA có thể khác nhau, bạn có tin tưởng mọi người triển khai làm đúng không?

Không có vấn đề gì, tôi sẽ viết mã phòng thủ và kiểm tra null.

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 mà các thông số kỹ thuật sẽ giúp chúng ta, và không.

Tôi đoán rằng trả về null (nếu thực sự 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 nào".

Bạn có thể có một đường dẫn mã (có thể là một ngoại lệ) xử lý các truy vấn không thể phân tích, tôi sẽ có xu hướng hướng một trả về rỗng xuống đường dẫn đó.


+1, bạn đã rất đúng khi nói: "bạn có tin tưởng mọi nhà cung cấp JPA không?" KHÔNG :)
dfa 12/07/09

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

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

2
"Tôi không hiểu truy vấn" nên được xử lý như Exception, trả lại nullở đâu Collectiontrong loại trả lại là một lỗi thiết kế rõ ràng
matoni

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 mà không có thực thể nào phù hợp, tôi nhận được một danh sách trống, không rỗng. Điều này đang sử dụng Hibernate và là những gì tôi coi là hành vi đúng: một danh sách trống là câu trả lời chính xác khi bạn yêu cầu một tập hợp các thực thể và không có bất kỳ thực thể nào.


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

3

Nếu bạn nhìn kỹ vào org.hibernate.loader.Loader(4.1), bạn sẽ thấy rằng 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 bây giờ.


2
Chúc mừng vì đoạn mã chính xác. Nhưng câu trả lời này chỉ tập trung vào chế độ ngủ đông, một trong những cách triển khai đặc điểm kỹ thuật. Các triển khai khác như OpenJPA khác nhau về hành vi. Ngoài ra, hibernate dường như đã thay đổi hành vi qua các phiên bản khác nhau.
venky

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ệ.


0

Query.getResultList()trả về một danh sách trống thay vì null. Vì vậy, hãy kiểm tra isEmpty()kết quả trả về và tiếp tục với phần logic còn lại nếu nó sai.


0

Với việc triển khai getResultsList()trong org.hibernate.ejb.QueryImpllớp, có thể trả về null:

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

Phiên bản ngủ đông của tôi là: 3.3.1.GA

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.