Подтвердить что ты не робот

Hibernate Присоединиться с использованием критериев и ограничений

У меня есть 2 объекта как

PayoutHeader.java

@Entity
public class PayoutHeader extends GenericDomain implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;        
    @Column
    private Integer month;
    @Column
    private Integer year;
    @OneToOne
    private Bank bank;
    @Column
    private Double tdsPercentage;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date **chequeIssuedDate**;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date entryDate;

}

PayoutDetails.java

@Entity
public class PayoutDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;        

    @ManyToOne
    private PayoutHeader payoutHeader;

    @Column
    private Double amount;
    @Column
    private String bankName;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date clearingDate;
    @OneToOne    
    private Advisor advisor;

    @Column
    private Long **advisorId**;
}

Я хочу написать запрос с использованием Hibernate Criteria, например

Select pd.* from PayoutDetails pd, PayoutHeader ph where pd.payoutheaderId = ph.id and pd.advisorId = 1 and and ph.chequeIssuedDate BETWEEN STR_TO_DATE('01-01-2011', '%d-%m-%Y') AND STR_TO_DATE('31-12-2011', '%d-%m-%Y') ";

Я написал такой запрос

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.setFetchMode("PayoutHeader", FetchMode.JOIN)
                .add(Restrictions.between("chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));        

        return criteria.list();
    }

Но дает ошибку как

org.hibernate.QueryException: не удалось разрешить свойство: chequeIssuedДата: org.commission.domain.payout.PayoutDetails

Я думаю, что мы пытаемся найти поле chequeIssuedDate в PayoutDetails, но это поле находится в PayoutHeader. Как указать псевдоним во время соединения?

4b9b3361

Ответ 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.