Ответ 1
criteria.setFetchMode("PayoutHeader", FetchMode.JOIN)
просто указывает, что вы хотите получить заголовок с помощью соединения, и в этом случае, вероятно, не требуется. Он не меняет, какая таблица используется в ограничениях. Для этого вы, вероятно, хотите создать дополнительные критерии или псевдоним, более или менее следующим образом:
public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) {
Criteria criteria = getSession().createCriteria(PayoutDetails.class);
if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) {
criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString()));
}
criteria.createCriteria("payoutHeader")
.add(Restrictions.between("chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));
return criteria.list();
}
или (с использованием псевдонима)
public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) {
Criteria criteria = getSession().createCriteria(PayoutDetails.class);
if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) {
criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString()));
}
criteria.createAlias("payoutHeader", "header")
.add(Restrictions.between("header.chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));
return criteria.list();
}
См. документы Hibernate по запросам критериев для примеров этого.
Также, вероятно, не рекомендуется преобразовывать advisorId
в строку, так как она фактически является Long
и, вероятно, отображена в числовое поле в sql.
Общепринято также не отображать что-то вроде этого поля advisorId
вообще, если вы сопоставляете advisor
и используете ограничение на основе поля advisor
, аналогично тому, как это относится к полю payoutHeader
.
Я бы не стал беспокоиться о том, чтобы получить все поля из заголовка, но это может вести себя по-другому, если вы получите версию createCriteria
.