Hibernate使用标准和限制加入

Rah*_*wal 14 java hibernate hibernate-criteria

我有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;

}
Run Code Online (Sandbox Code Playgroud)

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**;
}
Run Code Online (Sandbox Code Playgroud)

我想用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') ";
Run Code Online (Sandbox Code Playgroud)

我写了这样的查询

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();
    }
Run Code Online (Sandbox Code Playgroud)

但是给出了错误

org.hibernate.QueryException:无法解析属性:chequeIssuedDate:org.commission.domain.payout.PayoutDetails

我认为是试图寻找chequeIssuedDate领域PayoutDetails,但这个领域是在PayoutHeader.如何在加入期间指定别名?

Don*_*oby 15

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();
    }
Run Code Online (Sandbox Code Playgroud)

或(使用别名)

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();
    }
Run Code Online (Sandbox Code Playgroud)

有关示例,请参阅Criteria Queries上的Hibernate文档.

它也可能不适合将advisorId字符串转换为字符串,因为它实际上是一个Long并且可能映射到sql中的数字字段.

advisorId如果您映射advisor,并且使用基于advisor字段的限制,与此处理payoutHeader字段的方式类似,通常也不会映射此字段之类的内容.

我不担心从标题中获取所有字段,但如果您使该createCriteria版本工作,它可能会有所不同.