2013-11-27 21 views
5

Có cách nào để sử dụng kết quả ICriteria làm 'cơ sở' cho truy vấn tiêu chí tiếp theo không?Thực hiện tiêu chí nHibernate trên kết quả của truy vấn khác (hai truy vấn khác biệt)

Ví dụ nếu tôi muốn tạo ra một truy vấn

SELECT department_id, sum(cost) AS total 
FROM payment 
GROUP BY payment.department_id 

lưu trữ kết quả như query0, và sau đó thực hiện các truy vấn

SELECT department.name, total 
FROM department, query0 
JOIN LEFT ON department.id=query0.id 
WHERE total > 3 

Tôi không muốn có một truy vấn khổng lồ duy nhất thực hiện tất cả cùng một lúc (đó sẽ là kết quả của việc tạo một ICriteria với truy vấn phụ). Lưu ý rằng tôi có một lựa chọn/hạn chế trên kết quả của truy vấn đầu tiên và đồng thời bao gồm một trong các cột của nó trong phép chiếu của truy vấn thứ hai.

Tiêu chí được tạo động bằng chuỗi để xác định các lớp.

+1

Im không familir với ICriteria, nhưng couldnt truy vấn đầu tiên phân phát dưới dạng cơ sở hoặc rootquery và sau đó quấn một lựa chọn mới xung quanh nó ?? –

+1

Có lẽ bạn chỉ nên lọc các bộ phận của truy vấn của bạn0 với tổng số> 3 và sau đó nhận được các điểm khởi hành với mệnh đề IN trong truy vấn thứ hai của bạn. Bài đăng đẹp từ Ayende về vấn đề này khi danh sách IN thực sự lớn: http://ayende.com/blog/2583/nhibernates-xml-in cũng như liên kết không bị hỏng tới mã XmlIn.cs: http: //. google.com/p/hornget/source/browse/trunk/package_tree/frameworks/rhino.tools/rhino/patch/commons/Rhino.Commons.NHibernate/NHibernate/XmlIn.cs?spec=svn78&r=78 – jbl

+1

@Kay Nelson Điều này chính xác là cách tiếp cận của các tiêu chí tách rời với một truy vấn được kết hợp, nhưng duy nhất. @ jbl Tôi vẫn cần tổng số trong chiếu. Và giải pháp này sẽ chỉ hoạt động trong trường hợp cụ thể này (ví dụ: nếu không tham gia vượt quá 'department.id = query0.id AND department.XYZ == query0.XYZ') – Dani

Trả lời

1

Điều gần nhất tôi có thể nghĩ đến đây là Biểu thức bảng chung (câu lệnh SQL WITH). Thật không may NHibernate dường như không có bất kỳ trừu tượng tốt để đối phó với CTEs, nhưng đây là cách truy vấn của bạn có thể nhìn vào SQL Server:

WITH query0 AS (
    SELECT department_id AS id, sum(cost) AS total 
    FROM payment 
    GROUP BY payment.department_id 
) 
SELECT department.name, total 
FROM department, query0 
WHERE department.id=query0.id 
AND total > 3; 

SQL Fiddle: http://sqlfiddle.com/#!3/8e6877/7

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