복붙노트

[SQL] Critieria API를 NHibernate에있는 하위 쿼리에서 선택

SQL

Critieria API를 NHibernate에있는 하위 쿼리에서 선택

나는 다음과 같은 구조의 SQL 쿼리가 그래서 :

select p.* from
(
    select max([price]) as Max_Price,
    [childId] as childNodeId
    from [Items] group by [childId]
) as q inner join [Items] as p on p.[price] = q.[Max_Price] and p.[childId] = q.[childNodeId]

내가 기준 API를 사용하여, NHibernate에이 쿼리를 다시 작성해야합니다. 나는 하위 쿼리 API를 사용하여 시도,하지만 내부 쿼리가 외부 쿼리의 속성과 평등을 확인하는 하나의 열을 반환해야 할 것 같다. 그러나, 나는 두 돌아갑니다. 나는 이것이 HQL API를 통해 수행 할 수 있습니다 읽었습니다,하지만 우리는 동적으로 비행에이 같은 쿼리를 생성 할 겁니다으로 나는, 기준 API와 함께 할 필요가있다. 사람이 여기에 올바른 방향으로 날 조종 할 수 있습니까?

해결법

  1. ==============================

    1.나는 약간 원래의 SQL 쿼리를 적용하여 비슷한 문제를 해결하기 위해 관리했습니다. 나는이 (의사 SQL 코드) 같은 것을 함께 종료했습니다

    나는 약간 원래의 SQL 쿼리를 적용하여 비슷한 문제를 해결하기 위해 관리했습니다. 나는이 (의사 SQL 코드) 같은 것을 함께 종료했습니다

    SELECT p.* FROM [Items] as p
    WHERE EXISTS
    (
        SELECT [childId] as childNodeId FROM [Items] as q
        WHERE p.[childId] = q.[childNodeId]
        GROUP BY q.[childId] 
        HAVING p.[price] = MAX(q.[price])
    )
    

    그리고 이것은 QueryOver 구현은 다음과 같습니다

    var subquery = QueryOver.Of(() => q)
      .SelectList(list => list.SelectGroup(() => q.ChildId))
          .Where(Restrictions.EqProperty(
              Projections.Property(() => p.Price), 
              Projections.Max(() => q.Price)))
          .And(Restrictions.EqProperty(
              Projections.Property(() => p.ChildId), 
              Projections.Property(() => q.ChildId)));
    

    여기에서 당신은 단지 NHibernate에이 (의사 코드) 제대로하는 엔티티를 해결 할 수 있도록 별칭을 전달해야합니다 :

    var filter = QueryOver.Of(() => p)
        .WithSubquery.WhereExists(GetSubQuery(p, criteria...));
    

    나는이 특정 경우에 도움이되기를 바랍니다.

    UPDATE : 기준 API

    var subquery = DetachedCriteria.For<Items>("q")
        .SetProjection(Projections.ProjectionList()
            .Add(Projections.GroupProperty("q.ChildId")))
        .Add(Restrictions.EqProperty("p.Price", Projections.Max("q.Price")))
        .Add(Restrictions.EqProperty("p.ChildId", "q.ChildId"));
    
    var query = DetachedCriteria.For<Items>("p")
        .Add(Subqueries.Exists(subquery));
    

    그럼에도 불구하고 나는 QueryOver 버전으로 고집 추천 할 것입니다, 그것은 훨씬 더 직관적이고 당신이 (당신이 NH 버전을 업그레이드 할 필요가 없습니다 특히 있음) 마법 문자열을 피하십시오.

    이 당신을 위해 작동하는지 알려 주시기 바랍니다.

  2. from https://stackoverflow.com/questions/6541229/selecting-on-sub-queries-in-nhibernate-with-critieria-api by cc-by-sa and MIT license