Câu trả lời:
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.
if(rows == null || rows.size == 0){}
nơi hàng là gì () trả về getResultList
null
thay 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 null
và tự trả lại danh sách trống nếu cần.
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 đó.
Exception
, trả lại null
ở đâu Collection
trong loại trả lại là một lỗi thiết kế rõ ràng
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.
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ờ.
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ệ.
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.
Với việc triển khai getResultsList()
trong org.hibernate.ejb.QueryImpl
lớ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