Вы делаете это неправильно, потому что у вас не может быть "половины" сущности домена.Вам нужны транзакции, поэтому вы должны запрашивать транзакции.
В hql:
from Transaction t
where t.Amount <= :limit
Хотите ли вы получить свойство User?
from Transaction t
join fetch t.User
where t.Amount <= :limit
ТогдаВы можете создать именованный запрос или выполнить
session.CreateQuery(query).List<Transaction>();
Если вам нужна структура объекта, подобная вашему объекту домена, вы можете сделать следующее:
public class UserWithTransactionsViewModel
{
public string UserName {get; set; }
public IEnumerable<TransactionViewModel> Transactions {get; set;}
}
вы можете создать проекцию вПамять выглядит следующим образом:
var vms = session.CreateQuery(query)
.List<Transaction>()
.GroupBy(t => t.User)
.Select( g => new UserWithTransactionViewModel
{
UserName = g.Key.Name
Transactions = g.Select(t => new TransactionViewModel(....)).ToArray()
});
Другой подход будет заключаться в том, чтобы запрашивать пользователей с одной транзакцией с суммой, превышающей ..., а затем фильтровать транзакции в памяти при проецировании на модель представления или dto.Но мне это не нравится, потому что у вас есть логика для фильтрации в двух разных местах, это хуже по производительности, потому что вы получите в память даже транзакции, которые вам не нужны.
Мой общий совет заключается в том, что когдавы работаете с ORM, ваши экземпляры должны быть согласованы в памяти всегда .
PS: вам не нужно свойство UserId в классе Transaction.Это ошибка дизайна.