Установка проекции по критериям подзапроса после разбивки на страницы (SetFirstResult () и SetMaxResults ()) - PullRequest
1 голос
/ 07 ноября 2011

Допустим, у меня есть код, подобный этому:

DetachedCriteria limitCriteria = CriteriaTransformer.Clone(criteria);
limitCriteria.SetProjection(Projections.Id()).SetFirstResult(30).SetMaxResults(10);

DetachedCriteria pagedCriteria = CriteriaTransformer.Clone(criteria);
pagedCriteria.Add(Subqueries.PropertyIn("Id", limitCriteria));

var entities = pagedCriteria.GetExecutableCriteria(session).List<SomeEntity>();

, и он генерирует запрос Oracle SQL следующим образом:

SELECT this_.TID  AS TID135_6_,
  . . . -- a lot of fields here
FROM SomeEntity this_,
  . . . -- a lot of tables here
WHERE 
    . . . -- a lot of conditions here
    AND this_.TID IN

  (SELECT *
  FROM
    (SELECT row_.*,
      rownum rownum_
    FROM
      (SELECT this_0_.TID AS y0_
      FROM EXECDESK.ORDER_EXECUTION_CONFIRMATION this_0_
      WHERE this_0_.OPUS_ORDER_EXECUTION_ID IS NULL
      ) row_
    WHERE rownum <= 40
    )
  WHERE rownum_ > 30
  ) 

Сбой выполнения запроса с сообщением «слишком много значений», посколькуSELECT в предложении IN возвращает два столбца (ID и rownum).

Я попытался создать проекцию над оператором подзапроса (без успеха), чтобы получить SQL, подобный этому:

SELECT this_.TID  AS TID135_6_,
  . . . -- a lot of fields here
FROM SomeEntity this_,
  . . . -- a lot of tables here
WHERE 
    . . . -- a lot of conditions here
    AND this_.TID IN

( select y0_ from    
  (SELECT *
  FROM
    (SELECT row_.*,
      rownum rownum_
    FROM
      (SELECT this_0_.TID AS y0_
      FROM EXECDESK.ORDER_EXECUTION_CONFIRMATION this_0_
      WHERE this_0_.OPUS_ORDER_EXECUTION_ID IS NULL
      ) row_
    WHERE rownum <= 40
    )
  WHERE rownum_ > 30
  )    
)

Как мне написать запрос ICriteria, чтобы получить только столбец идентификатора?

...