2013-11-27 2 views
5

ICriteria 결과를 후속 조건 쿼리의 '기본'으로 사용할 수 있습니까? 예를 들어 다른 쿼리 (두 개의 다른 쿼리)에 nHibernate icriteria 실행

내가

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

내가 하나 개의 큰 쿼리를 실행하고 싶지 않아요 쿼리를 query0으로 쿼리

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

저장에게 결과를 만든 다음 실행하려는 경우

한꺼번에 (서브 쿼리를 사용하여 ICriteria를 작성한 결과) 첫 번째 쿼리의 결과에 대한 선택/제한이 있고 동시에 두 번째 쿼리의 투영에 해당 열 중 하나가 포함된다는 점에 유의하십시오.

기준은 클래스를 식별하기 위해 문자열을 사용하여 동적으로 생성됩니다.

+1

임 ICriteria와 familir 아니지만, couldnt는 불행하게도 NHibernate에 여기 CTE를 처리하기위한 좋은 추상화를 갖고있는 것 같다,하지만하지 않습니다 당신의 쿼리가 SQL 서버에서 볼 수있는 방법입니다 첫 번째 쿼리는 기본 또는 루트 쿼리로 사용되며 그 다음에 새 선택을 래핑합니다. –

+1

아마도 total> 3 인 query0의 department_ids를 필터링 한 다음 두 번째 쿼리에서 IN 절을 사용하여 departements를 가져와야합니다. IN 목록이 정말 큰 경우 Ayende의 멋진 게시글 인 http://ayende.com/blog/2583/nhibernates-xml-in과 XmlIn.cs의 http : // code와의 연결이 끊어지지 않았습니다. 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 This 병합되었지만 단일 쿼리로 분리 된 기준의 접근 방식입니다. @ jbl 난 여전히 프로젝션에 총을 필요합니다. 그리고이 솔루션은이 특별한 경우에만 작동합니다 (예 : join이 'department.id = query0.id AND department.XYZ == query0.XYZ' 이상인 경우) – Dani

답변

1

내가 생각할 수있는 가장 가까운 것은 공통 테이블 식 (SQL WITH 문)입니다.

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 바이올린 : http://sqlfiddle.com/#!3/8e6877/7

관련 문제