2010-02-04 32 views
17

Tôi muốn nhận được số lượng kết quả của truy vấn HQL được tạo động, mà không thực sự nhận được danh sách kết quả. Nói rằng các truy vấn tôi có là cái gì đó như:Hibernate HQL: Nhận số kết quả mà không thực sự trả lại chúng

select Company company LEFT OUTER JOIN FETCH products product 

Tôi đọc trong tài liệu Hibernate rằng:

Bạn có thể đếm số lượng các kết quả truy vấn mà không trả lại cho họ:

((Integer) session.createQuery("select count(*) from ....").iterate().next()).intValue() 

Tôi nghi ngờ rằng tôi nên thay thế .... bằng truy vấn của mình, nhưng điều đó không hoạt động, vì HQL không cho phép ort lựa chọn phụ trong FROM.

Vì vậy, làm cách nào tôi nên đếm kết quả của truy vấn HQL được tạo động? Tôi nghĩ rằng bằng cách thực hiện nó và nhận được .size() của danh sách kết quả có thể là chi phí không cần thiết.

Chúc mừng!

** UPDATE: **

tôi đã sử dụng regex này để chuyển đổi truy vấn của tôi:

Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult(); 

Và tôi có được điều này:

Blockquote

EJB Ngoại lệ:; ngoại lệ lồng nhau là: java.lang.IllegalArgumentException: org.hibernate.QueryException: truy vấn được chỉ định tham gia tìm nạp, 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 [FromElement {rõ ràng, không phải là một bộ sưu tập nối, tìm nạp, tìm nạp không Thuộc tính -lazy, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT applicant0_, colums = {applicant0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [lựa chọn số () từ org.myCompany.applicant.entity.Applicant người nộp đơn LEFT OUTER JOIN FETCH applicant.products sản phẩm]; ngoại lệ lồng nhau là: java.lang.IllegalArgumentException: org.hibernate.QueryException: truy vấn được chỉ định tham gia tìm nạp, 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 [FromElement {rõ ràng, không phải là một bộ sưu tập nối, tìm nạp, tìm nạp không Thuộc tính -lazy, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT applicant0_, colums = {applicant0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [select count () từ org.myCompany.applicant.entity.Applicant đơn LEFT OUTER JOIN FETCH applicant.products sản phẩm]

Trả lời

14

này nên làm như lừa:

select count(*) FROM Company c JOIN ... 

Không có lựa chọn phụ liên quan, thay vì trả lại Company, bạn trả lại số lượng.

Chỉnh sửa:FETCH hiện đã hết. Bạn không trả lại các thực thể từ truy vấn, nhưng chỉ đếm, do đó, Hibernate than phiền.Loại bỏ nó sẽ giúp:

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product 
+0

Có, tôi đã cố gắng đó. Tôi nhận được một ngoại lệ: QueryException: 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. Xem bảng kê của tôi để biết dấu vết ngăn xếp đầy đủ –

+0

@Markos: Tôi đã cập nhật câu trả lời của mình. – Henning

+0

Cảm ơn người đàn ông, nó đã hoạt động! –

12

bạn có thể lấy số liệu về kết quả truy vấn bằng cách sử dụng:

criteria.setProjection(Projections.rowCount()); 
count=(Long) criteria.uniqueResult(); 

hy vọng điều này giúp

+4

Điều này không hữu ích. Phương thức rowCount() thuộc về API Criteria, nhưng OP đang sử dụng HQL. – jjmontes

+5

Tôi đã tìm kiếm API tiêu chí để 'đếm' và gợi ý này hữu ích cho tôi. –

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