Я не склонен использовать HQL, поэтому не могу дать вам совет, но я не уверен, что приведенный выше запрос - именно то, что вам нужно.Вы хотите получить все потери независимо от критериев дочерних объектов?Приведенный выше запрос вернет только те потери, которые соответствуют критериям, установленным для дочерних объектов.Похоже, вы хотите вернуть все потери, которые соответствуют основным критериям, но отфильтровать дочерние коллекции по ним?Под этим я подразумеваю, что с учетом текущего запроса, если у вас есть убыток, который имеет статус 2, но не имеет платежей с типом платежа 2, сущность убытков не будет возвращена из запроса.Вместо этого я думаю, что вам нужно применить фильтр к объединению, чтобы объект потери возвращался из запроса, но сбор платежей пуст.Например, что-то вроде этого для первого запроса:
int[] values = new int[] { 1,2,3};
var query1 = session.CreateCriteria<Trade>()
.CreateAlias("Status", "s").Add(Expression.Not(Expression.In("s.Status", values)))
.CreateAlias("Reserves", "r", JoinType.LeftOuterJoin, Expression.Not(Expression.Eq("r.Status", 3)));
Критерии ассоциации резервов будут добавлены в предложение левого внешнего соединения, означающее, что фильтр применяется только к этому отношению.Во втором запросе вам нужно что-то похожее, но я не уверен, что вы можете поместить ограничения из другой таблицы в левое внешнее соединение (Payment.Reserve.Status! = 4).Для этого вы можете использовать подзапрос.Что-то вроде:
DetachedCriteria paymentSubQuery = null; //make a query for getting all payments with type 2 and reserve.Status != 4
var query2 = session.CreateCriteria<Trade>()
.CreateAlias("Status", "s").Add(Expression.Not(Expression.In("s.Status", values)))
.CreateAlias("Payments", "p", JoinType.LeftOuterJoin).Add(Subqueries.PropertyIn("p.Id", paymentSubQuery));
Я на самом деле не запускал их, но думаю, что это должно примерно дать вам то, что вы хотите.