Допустим, у меня есть код, подобный этому:
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, чтобы получить только столбец идентификатора?