среда, 14 мая 2008 г.

Критерии

Столкнулся с выборкой данных по критериям.

Если необходимо отобрать объекты по нескольким полям, поступаем просто:
Session session = (Session) em.getDelegate();
Criteria criteria = session.createCriteria(Payment.class);

criteria.addOrder(Order.desc("paymentDate"));
criteria.add(Restrictions.eq("id", request.getPaymentId()));
criteria.add(Restrictions.ge("paymentDate", request.getSince()));
criteria.add(Restrictions.le("paymentDate", request.getTill()));

return criteria.list();
Все просто, все понятно.
Но если необходимо отобрать записи не по полю объекта, а по полю объекта, на который ссылается данный?

В этом случае правильное рещение выглядит так (допустим, что entity Payment имеет ссылку на entity Account)
criteria = criteria.createCriteria(Payment.class);

// добавляем отбор по полям класса Payment

// Опускаемся к объекту Account
criteria = criteria.createCriteria("Account");

// Добавляем отбор по полям Account
criteria.add(Expression.eq("accountNumber", 123));
Но если нужно сделать отбор по embedded полю, поступить следует так:
criteria.add(Restrictions.eq("account.accountNumber", 123));

1 комментарий:

Андрей комментирует...

так же для этих целей можно и нужно использовать alias-ы